2015-08-16 98 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); 
相关问题