Winsock仅在连接到localhost时返回10061

时间:2012-04-25 00:31:34

标签: windows networking winsock

我不明白发生了什么事。如果我创建一个套接字到localhost以外的任何其他地方(“localhost”,“127.0.0.1”或机器的外部IP),它可以正常工作。 如果我创建一个地址的套接字没有在该端口监听,我会得到10060(超时)但不是10061这是有道理的。为什么在访问localhost时我拒绝连接。 我试过禁用防火墙以防万一它弄乱了,但那不是它

我在此之前正在做所有的WSA初始化。

    _socketToServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(_socketToServer == -1){
    return false;
    }

   p_int = (int*)malloc(sizeof(int));
   *p_int = 1;
   if( (setsockopt(_socketToServer, SOL_SOCKET, SO_REUSEADDR, 
       (char*)p_int, sizeof(int)) == -1 )||
       (setsockopt(_socketToServer, SOL_SOCKET, SO_KEEPALIVE, (char*)p_int,
               sizeof(int)) == -1 ) ){
        free(p_int);
        return false;
   }
   free(p_int);


   struct sockaddr_in my_addr;

   my_addr.sin_family = AF_INET ;
   my_addr.sin_port = htons(_serverPort);

   memset(&(my_addr.sin_zero), 0, 8);
   my_addr.sin_addr.s_addr = inet_addr(_serverIP);


   if( connect( _socketToServer, (struct sockaddr*)&my_addr, sizeof(my_addr)) 
        == SOCKET_ERROR ){
    DWORD error = GetLastError(); //here is where I get the 10061
    return false;
}

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

连接到另一台计算机上的非侦听端口时,不保证会出现WSAETIMEDOUT错误。可能发生任何数量的不同错误。但是,如果套接字在WSAETIMEDOUT超时之前无法访问网络上的目标计算机,则通常只会发生connect()错误。如果它可以到达目标计算机,则WSAECONNREFUSED错误意味着目标计算机正在确认connect()请求并且正在回复说当时所请求的端口无法接受连接,因为它是没有听,或者积压已满(没有办法区分哪个)。因此,当您连接到localhost时,连接到非侦听端口时几乎总会出现WSAECONNREFUSED错误,因为您正在连接到同一台计算机,并且确定端口的侦听状态没有任何延迟。它与防火墙或反恶意软件无关。这只是正常行为。