首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++ winsock服务器接受函数返回10022错误

C++ winsock服务器接受函数返回10022错误
EN

Stack Overflow用户
提问于 2019-06-06 02:09:37
回答 1查看 475关注 0票数 -1

我摆脱了这个错误,现在我似乎被其他东西卡住了。

我在Code::块上有单独的Winsock客户端和服务器程序。我试图从客户机向服务器发送一条消息,但是服务器程序似乎在accept()函数之前就冻结了,除了“侦听传入的连接”之外什么也没做。输出。客户端缓冲区中的消息永远不会出现在服务器控制台中。

看起来肯定是服务器程序中的accept函数出了问题。这似乎是服务器程序冻结的地方。在那之后,我尝试输入一个随机的cout行,但是没有输出。

在“消息发送”之后,客户端似乎也冻结了。但几分钟后,我看到"recv失败“,然后是”回复已收到“,然后是一行类似于表情符号的文字。我想我有下面链接的图片。

enter image description here

下面是我的客户端代码:

#include <iostream>
#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main()
{

    WSADATA wsaData;
    SOCKET sock;
    sockaddr_in server;
    char *buffer, server_reply[2000];
    int recv_size;

    int iResult;

iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
    printf("WSAStartup failed: %d\n", iResult);
} else {
     printf("WSAStartup successful!: %d\n", iResult);
}

sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET){
    printf("Socket not created.\n");
} else {
    printf("Socket created.\n");
}

    server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    server.sin_family = AF_INET;
    server.sin_port = htons(80);

    if(connect(sock, (SOCKADDR *)&server, sizeof(server)) != 0){
        printf("Connect Error : %d" , WSAGetLastError());
    } else {
        printf("Connected\n");
    };

    buffer = "Hello there!";
    send(sock, buffer, sizeof(buffer), 0);

        printf("Message Sent.\n");


    if((recv_size = recv(sock , server_reply , 2000 , 0)) == SOCKET_ERROR)
    {
        puts("recv failed");
    }

    puts("Reply received\n");
    //Add a NULL terminating character to make it a proper string before printing
    server_reply[recv_size] = '\0';
    puts(server_reply);


    closesocket(sock);
    WSACleanup();

    return 0;
}

下面是我的服务器代码:

#include <iostream>
#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main()
{

    WSADATA wsaData;
    SOCKET server1, client;
    sockaddr_in serverAddr, clientAddr;


    int iResult;

iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
    printf("WSAStartup failed: %d\n", iResult);
} else {
     printf("WSAStartup successful!: %d\n", iResult);
}

server1 = socket(AF_INET, SOCK_STREAM, 0);
if (server1 == INVALID_SOCKET){
    printf("Socket not created.\n");
} else {
    printf("Socket created.\n");
}

    serverAddr.sin_addr.S_un.S_addr = INADDR_ANY;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(8888);

    if(bind(server1, (SOCKADDR *)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR){
        printf("Bind failed. : %d" , WSAGetLastError());
    } else {
        printf("Bind successful.\n");
    }

    if(listen(server1, SOMAXCONN) != 0){
        printf("Server not listening. : %d" , WSAGetLastError());
    } else {
        cout << "Listening for incoming connections..." << endl;
    }



    char buffer[1024];
    int clientAddrSize = sizeof(clientAddr);
    if((client = accept(server1, (SOCKADDR *)&clientAddr, &clientAddrSize)) == INVALID_SOCKET)
    {
        printf("Connect Error : %d" , WSAGetLastError());
    } else {
        cout << "Client connected!" << endl;
        recv(client, buffer, sizeof(buffer), 0);
        cout << "Client says: " << buffer << endl;
        memset(buffer, 0, sizeof(buffer));

        closesocket(client);
        closesocket(server1);
        cout << "Client disconnected." << endl;
    }
    WSACleanup();

    return 0;
}

我正在尝试使用CodeBlocks中的C++构建一个Winsock服务器程序,以便与我的客户机程序一起使用。但是,accept函数返回错误代码10022,据我所知,这意味着无效参数。我不认为我在accept函数中的任何参数都是无效的。谢谢你的帮助!

int main()
{

    WSADATA wsaData;
    SOCKET server1, client;
    sockaddr_in serverAddr, clientAddr;


    int iResult;

iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
    printf("WSAStartup failed: %d\n", iResult);
} else {
     printf("WSAStartup successful!: %d\n", iResult);
}

server1 = socket(AF_INET, SOCK_STREAM, 0);
if (server1 == INVALID_SOCKET){
    printf("Socket not created.\n");
} else {
    printf("Socket created.\n");
}

    serverAddr.sin_addr.S_un.S_addr = inet_addr(INADDR_ANY);
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(8888);

    bind(server1, (SOCKADDR *)&serverAddr, sizeof(serverAddr));
    listen(server1, SOMAXCONN);

    cout << "Listening for incoming connections..." << endl;

    char *buffer;
    int clientAddrSize = sizeof(clientAddr);
    if((client = accept(server1, (SOCKADDR *)&clientAddr, &clientAddrSize)) == INVALID_SOCKET)
    {
        printf("Connect Error : %d" , WSAGetLastError());
    } else {
        cout << "Client connected!" << endl;
        recv(client, buffer, sizeof(buffer), 0);
        cout << "Client says: " << buffer << endl;
        memset(buffer, 0, sizeof(buffer));

        closesocket(client);
        closesocket(server1);
        cout << "Client disconnected." << endl;
    }
    WSACleanup();

    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2021-08-21 11:05:19

只需从您的代码中删除这一行:

using namespace std;

一切都会好起来的。

之所以会出现这个错误,是因为std包具有类似的bind函数,所以当您调用bind时,它会调用std::bind,而不是socket的bind。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56465874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档