关于tcpsokcet连接的问题

aniugee 2009-02-13 11:07:20

procedure TForm1.Button1Click(Sender: TObject);
begin
FSocket := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if FSocket = INVALID_SOCKET then
showmessage('ErrorCode'+inttostr(WSAGetLastError));
self.Button2.Enabled:=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
serverAddr: TSockAddrIn;
lastError: Integer;
begin
serverAddr.sin_family:= AF_INET;
serverAddr.sin_port:= htons(strtoint(self.Edit2.Text));//服务器端口
serverAddr.sin_addr.S_addr:= inet_addr(PAnsiChar(self.Edit1.Text));//服务器IP

WinSock2.connect(FSocket,@serverAddr,SizeOf(serverAddr));
lastError := WSAGetLastError();
if lastError <> 0 then
showmessage('connect:'+inttostr(lastError))
else
begin
FConnected:=true;
showmessage('连接成功');
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
aWSAData: TWSAData;
begin
if WSAStartup($202, aWSAData) <> 0 then
ShowMessage('初始化WinSock2失败,请确认系统是否正确安装了WinSock2');
FSocket := INVALID_SOCKET;
FConnected:=false;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
closesocket(FSocket);
WSACleanup;
end;

先点button1 再点button2.
上述代码在94%的机器上没有问题,都提示连接成功,但另外6台却错,就是这一句WinSock2.connect(FSocket,@serverAddr,SizeOf(serverAddr)),然后用
WSAGetLastError得到的返回值是2,请大家帮忙分析一下。
...全文
124 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuilongjian 2009-02-16
  • 打赏
  • 举报
回复
兄弟是我回的。H0101
接分了
glacierful 2009-02-16
  • 打赏
  • 举报
回复
学习
aniugee 2009-02-16
  • 打赏
  • 举报
回复
问题已解决,换成winsockt单元就行了,不用winsockt2了。区别好像是PF_INET和AF_INET这个地方,具体原因还不明白。
这是群里的一位兄弟歪打正着帮到我的忙,等他来接分,不来就改成散分贴了。哪位兄弟知道原理的,麻烦给讲一下。

function TForm1.conn: Boolean;
var
SCI: sockaddr_in;
hostAddr: u_long;
begin
Result:= false;
try
if FConnected then
begin
Result:= True;
Exit;// 如果已经连接,则退出
end;
FSocket := socket(PF_INET,SOCK_STREAM,IPPROTO_IP); //创建socket
if (FSocket = INVALID_SOCKET) or (FSocket = SOCKET_ERROR) then
showmessage('ErrorCode:'+inttostr(WSAGetLastError));

sci.sin_family:= PF_INET;//定义协议簇
sci.sin_port:= htons(strtoint(self.Edit2.Text));
hostAddr:= inet_addr(PChar(self.Edit1.Text));
if hostAddr= -1 then
begin
closesocket(FSocket);
Exit;
end
else
sci.sin_addr.S_addr:= hostAddr;

if connect(FSocket,sci,SizeOf(sci))<>0 then
begin
showmessage('connect:'+inttostr(WSAGetLastError));
closesocket(FSocket);
Exit;
end;
except
closesocket(FSocket);
Exit;
end;
FConnected:= true;
showmessage('连接成功');
Result:= True;
end;
僵哥 2009-02-16
  • 打赏
  • 举报
回复
比较大可能是XP系统的连接数限制。
aniugee 2009-02-16
  • 打赏
  • 举报
回复
socket has had listen
是这回事,用工具查了一下,socket建立不了监听端口,但是什么原因引起的呢,怎么解决?
aniugee 2009-02-13
  • 打赏
  • 举报
回复
怎么解决呢?
gzmhero 2009-02-13
  • 打赏
  • 举报
回复
#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ 套接口正在用listen()监听
Gcc 2009-02-13
  • 打赏
  • 举报
回复
貌似没有什么问题啊,关注下。。。

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧