2013-05-28 25 views
1

我想創建一個連接到我提供的服務器/端口 - 在進行連接時,我能夠發送它的ping數據包(至少我想我能,因爲發送()似乎返回正確的字節數),但是當我嘗試的recv()之後,調用失敗說連接拒絕Recv(),而發送似乎工作正常

"Error on Receiving .. Connection Refused" 

爲什麼發送是否有任何想法不是給錯誤,但recv會?以下是導致我的失敗的代碼的一部分 - 它運行在它自己的線程上。 TCP連接是在另一個線程上完成的,並且該套接字描述符被傳遞給了這個套接字描述符(下面稱爲m_sockfd)。

void ConnectionManager::operator()() 
{ 

    int rc = 0, numBytes=0 ; 
    char reply[256] ; 

    // Send a ping 
    char PingPacket[23] ; 
    PreparePingPacket(PingPacket) ; 
    numBytes = send(m_sockfd,PingPacket,23,0); 
    if(numBytes == -1) 
    { 
    fprintf(stderr, "Error on Sending Ping .. \n") ; 
    return ; 
    } 
    if(numBytes < 23) 
    { 
    fprintf(stderr, "Didn't send the whole Ping Request .. %d \n", numBytes) ; 
    } 

    numBytes = recv(m_sockfd, reply, 256, 0) ; 

    if(numBytes == -1) 
    { 
    fprintf(stderr, "Error on Receiving .. %s \n", strerror(errno)) ; 
    return ; 
    } 

    ParsePacket(reply, rc) ; 
} 

我可以貼上我的代碼來完成實際的連接,但我想,如果它有錯誤,然後發送就永遠不會走過來開始?

感謝您的閱讀 - 任何幫助讚賞!

+0

使用WSAGetLastError()獲取Winsock錯誤代碼,然後使用[Microsoft](http://msdn.microsoft.com/en-us/library/windows/desktop/ms741580(v = vs.85).aspx)看看它是什麼意思。 – Serdalis

+0

我在我大學的服務器上運行我的代碼,它的工作完美無缺 - 看起來我只是在家裏遇到這個問題。我曾使用端口轉發來指示所有到達特定端口的流量 - 並確認通過確保傳入連接能夠通過,但不知道爲什麼recv()發出61 /拒絕連接。 –

回答

0

想通了 - 從我這邊來看,這是非常愚蠢的事情。問題出在我的getaddrinfo()語句。在將memsetting設置爲全0之後,我不知何故傳入了「struct addrinfo」提示。這導致端點以某種方式無效。在更改結構中的值之前放置memset之後,此問題就消失了。仍然不確定發送如何通過,但這是問題所在。

相關問題