为什么这个WinSock代码没有连接到客户端

Why this WinSock code is not connecting to client?

本文关键字:连接 客户端 代码 WinSock 为什么      更新时间:2023-10-16

我是Winsock编程新手,在阅读《Network programming For 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();
}

在运行此代码时,它显示"COULD not CONNECT TO CLIENT"。错误码10014"。我在windows dev center上发现了这个错误代码的描述:错误的地址。

系统在尝试使用调用的指针参数时检测到一个无效的指针地址。如果应用程序传递了无效的指针值,或者缓冲区的长度太小,则会发生此错误。例如,如果一个参数的长度小于sizeof(sockaddr).

,它是一个sockaddr结构。

如何修复这个错误?

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

在你的代码中,修改:

int c = 1;

int c = sizeof(ClientAddr);