2

我不明白发生了什么。如果我创建一个到 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;
}

有任何想法吗?

4

1 回答 1

4

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

于 2012-04-25T01:49:07.197 回答