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,请大家帮忙分析一下。

解决方案 »

  1.   

    #define   SO_ACCEPTCONN       0x0002                     /*   socket   has   had   listen()   */ 套接口正在用listen()监听
      

  2.   

    socket  has  had  listen
    是这回事,用工具查了一下,socket建立不了监听端口,但是什么原因引起的呢,怎么解决?
      

  3.   

    问题已解决,换成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;