【问题标题】:Why this WinSock code is not connecting to client?为什么这个 WinSock 代码没有连接到客户端?
【发布时间】:2015-08-16 05:24:58
【问题描述】:

我是 Winsock 编程的新手,在阅读“Microsoft Windows 网络编程”一书时偶然发现了这段代码。但似乎这段代码无法连接到客户端。请告诉我如何解决这个问题。

我的服务器代码:

#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).

我该如何解决这个错误?

【问题讨论】:

  • 如果accept发生错误,它将返回INVALID_SOCKET,而不是SOCKET_ERROR。尝试打印确切的错误代码或含义。
  • @NaveenKumar 我已经编辑了代码并使用了 INVALID_SOCKET 而不是 SOCKET_ERROR 但仍然遇到同样的错误。
  • 从错误信息中你知道失败发生在accept调用中。查看accept function 文档,我们看到当发生错误时,“返回 INVALID_SOCKET 的值,并且可以通过调用 WSAGetLastError 来检索特定的错误代码。”。我们还可以看到可能的错误代码及其含义的表格。正如@NaveenKumar 建议的那样,您应该检索该特定错误以了解有关accept 故障的更多信息。
  • @FrankBoyne 我的错误代码是 10014,我在 windows 开发中心找到了这个描述:地址错误。我不知道如何解决它.. 请帮助 系统在尝试使用调用的指针参数时检测到无效的指针地址。如果应用程序传递了无效的指针值,或者缓冲区的长度太小,则会发生此错误。例如,如果参数的长度(即 sockaddr 结构)小于 sizeof(sockaddr)。
  • 尝试将c 设置为sizeof(ClientAddr) 而不是1

标签: c++ c visual-c++ winsock2 winsockets


【解决方案1】:

调用accept时,第三个参数指向的变量需要保存第二个参数指向的缓冲区的大小。 (accept返回时,会保存实际使用的空间量)

在您的代码中,更改:

int c = 1;

int c = sizeof(ClientAddr);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多