2012-04-25 79 views
2

我不明白髮生了什麼。如果我創建一個套接字到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

回答

4

當連接到另一臺機器上的非偵聽端口時,不保證會出現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