2015-08-16 113 views
-1

我是Winsock編程的新手,在閱讀「Microsoft Windows網絡編程」一書時遇到了這段代碼。但似乎這個代碼無法連接到客戶端。請告訴我如何解決這個問題。爲什麼這個WinSock代碼沒有連接到客戶端?

我的服務器代碼:

#include <iostream> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <ws2tcpip.h> 

#pragma comment(lib, "Ws2_32.lib") 

using namespace std; 

int main(){ 
    WSADATA wsadata; 
    int ret; 
    if ((ret = WSAStartup(MAKEWORD(2, 2), &wsadata)) != 0){ 
     cout << "Wsastartup failed" << endl; 
    } 
    else{ 
     cout << "connection made successfully" << endl; 
    } 

    SOCKET ListeningSocket, NewConnection; 
    SOCKADDR_IN ServerAddr, ClientAddr; 
    int port = 80; 

    ListeningSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
    ServerAddr.sin_family = AF_INET; 
    ServerAddr.sin_port = htons(port); 
    inet_pton(ServerAddr.sin_family,"127.0.0.1",&ServerAddr.sin_addr.s_addr); 
    int res= bind(ListeningSocket,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr)); 
    if (res == SOCKET_ERROR){ 
     cout << "binding failed" << endl; 
    } 
    res = listen(ListeningSocket,5); 
    if (res == SOCKET_ERROR){ 
     cout << "Listening failed" << endl; 
    } 
    int c = 1; 
    NewConnection= accept(ListeningSocket,(SOCKADDR*)&ClientAddr,&c); 
    if (NewConnection == INVALID_SOCKET){ 
cout << "COULD not CONNECT TO CLIENT . err code : "<<WSAGetLastError() << endl; 
    } 


    closesocket(ListeningSocket); 
    if (WSACleanup() == SOCKET_ERROR){ 
     cout << "WSACleanup failed with error : " << WSAGetLastError() << endl; 
    } 
    else{ 
     cout << "WinSock data cleaned successfully" << endl; 
    } 
cin.get(); 
} 

在運行這段代碼,它顯示「無法連接到客戶端犯錯代碼10014。」 我發現這個錯誤代碼在Windows開發中心的說明: 錯誤的地址。

系統在嘗試使用呼叫的指針參數時檢測到無效的指針地址。如果應用程序傳遞無效的指針值,或者緩衝區的長度太小,則會發生此錯誤。例如,如果參數的長度是sockaddr結構,它小於sizeof(sockaddr).

如何解決此錯誤?

+0

如果在[接受](HTTPS發生錯誤:/ /msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v=vs.85).aspx),它將返回INVALID_SOCKET,而不是SOCKET_ERROR。嘗試打印確切的錯誤代碼或含義。 –

+0

@NaveenKumar我編輯了代碼並使用了INVALID_SOCKET而不是SOCKET_ERROR,但仍然得到相同的錯誤。 –

+0

從錯誤消息中可以知道'accept'調用發生了故障。看看[接受函數](https://msdn.microsoft.com/en-us/library/windows/desktop/ms737526.aspx)文檔,我們看到當發生錯誤時「返回了INVALID_SOCKET的值,並且通過調用WSAGetLastError可以檢索特定的錯誤代碼。「我們也可以看到一張可能的錯誤代碼表及其含義。正如@NaveenKumar建議你應該檢索那個特定的錯誤,以更多地瞭解'accept'失敗。 –

回答

1

當您撥打accept時,第三個參數指向的變量需要保存第二個參數指向的緩衝區的大小。 (當accept返回時,它會容納的實際使用空間的量)

在您的代碼,更改:

int c = 1; 

int c = sizeof(ClientAddr); 
相關問題