Winsock返回10061只连接到本地主机

问题描述:

我不明白发生了什么。如果我创建一个套接字到localhost以外的任何地方(“localhost”,“127.0.0.1”或机器的外部IP),它可以正常工作。 如果我创建一个套接字到一个地址没有在该端口监听我会得到一个10060(超时),但不是10061有道理。为什么当我进入本地主机时,连接被拒绝? 我试过禁用防火墙,以防万一它搞砸了,但那不是它Winsock返回10061只连接到本地主机

我正在做所有的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; 
} 

任何想法?

+0

这听起来像是防火墙或反恶意软件。你真的在运行一个正在监听端口的程序吗? – 2012-04-25 00:40:54

+0

什么是端口号?你期望收到10060,还是你想要实际连接? – marcinj 2012-04-25 00:55:12

+0

我试过9001,9002 ... 9033。他们都没有工作。 我有一个程序正在倾听,但即使我没有得到相同的结果。 它从远程客户端工作。其实只是为了测试,我试图在同一台机器上通过腻子打开端口,并且我能够开始连接! (服务器代码自动发送数据,这就是我在终端中看到的)。我很困惑 – cloudraven 2012-04-25 01:56:04

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

+0

谢谢。知道这一点实际上非常有用。我感到困惑,因为无论端口如何,我都得到相同的错误信息。 最后,问题在重启后解决。我猜服务器套接字并没有真正接近。我应该尽早尝试。 – cloudraven 2012-04-25 02:03:41

+2

当积压工作满时,只有Windows服务器会导致ECONN/WSAECONNREFUSED。 Unix和Linux服务器导致超时。 – EJP 2012-04-25 09:57:50