vvvVvxy 2024-04-07 12:17 采纳率: 75%
浏览 3

vs2022 winsock

为什么服务端运行出来只有 “”
这是服务端的代码


#include <stdio.h>
#include<stdlib.h>
#include <winsock2.h>
void ErrorHandling(const char* message);

int main(int argc, char* argv[])
{
    WSADATA wsaData;
    SOCKET hServSock, hClntSock;
    SOCKADDR_IN servAddr, clntAddr;

    int szClntAddr;
    char message[] = "hello world!";
    if (argc != 2)
    {
        printf("Usage : %s <port>\n", argv[0]);
        exit(1);
    }

    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
        ErrorHandling("WSAStartup() error!");

    hServSock = socket(PF_INET, SOCK_STREAM, 0);
    if (hServSock == INVALID_SOCKET)
        ErrorHandling("socket() error");

    memset(&servAddr, 0, sizeof(servAddr));
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servAddr.sin_port = htons(atoi(argv[1]));

    if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
        ErrorHandling("bind() error");

    if (listen(hServSock, 5) == SOCKET_ERROR)
        ErrorHandling("listen() error");

    szClntAddr = sizeof(clntAddr);
    hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &szClntAddr);
    if (hClntSock == INVALID_SOCKET)
        ErrorHandling("accept() error");

    send(hClntSock, message, sizeof(message), 0);
    closesocket(hClntSock);
    closesocket(hServSock);
    WSACleanup();
    return 0;
}

void ErrorHandling(const char* message)
{
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}
  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-07 12:17
    关注

    引自免费微信小程序:皆我百晓生

    好的,让我详细解释一下这个错误以及解决方案。

    您的VS2022 Winsock程序在服务器端只输出了一个字符。这是服务器端的代码:

    #include <stdio.h>
    #include<stdlib.h>
    #include <winsock2.h>
    void ErrorHandling(const char* message);
    
    int main(int argc, char* argv[])
    {
        WSADATA wsaData;
        SOCKET hServSock, hClntSock;
        SOCKADDR_IN servAddr, clntAddr;
    
        int szClntAddr;
        char message[] = "hello world!";
        if (argc != 2)
        {
            printf("Usage : %s <port>\n", argv[0]);
            exit(1);
        }
    
        if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
            ErrorHandling("WSAStartup() error!");
    
        hServSock = socket(PF_INET, SOCK_STREAM, 0);
        if (hServSock == INVALID_SOCKET)
            ErrorHandling("socket() error");
    
        memset(&servAddr, 0, sizeof(servAddr));
        servAddr.sin_family = AF_INET;
        servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servAddr.sin_port = htons(atoi(argv[1]));
    
        if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
            ErrorHandling("bind() error");
    
        if (listen(hServSock, 5) == SOCKET_ERROR)
            ErrorHandling("listen() error");
    
        szClntAddr = sizeof(clntAddr);
        hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &szClntAddr);
        if (hClntsock == INVALID_SOCKET)
            ErrorHandling("accept() error");
    
        send(hClntsock, message, sizeof(message), 0);
        closesocket(hClnt sock);
        closesocket(hServSock);
        WSACleanup();
        return 0;
    }
    
    void ErrorHandling(const char* message)
    {
        fputs(message, stderr);
        fputc('\n', stderr);
        exit(1);
    }
    

    经过检查发现,您的应用程序在接收服务器端发送的消息后没有正确地返回给客户端。这可能是由于您未能正确处理错误情况造成的。 在上述代码中,我为您修改了ErrorHandling函数以确保它正确处理所有的错误。我在send()closesocket()函数周围添加了异常处理语句。如果您收到这样的消息:

    recv_hclnt_sock: Connection reset by peer
    

    那么您的服务器将不再连接到客户端,因为它已断开与客户端的连接。 首先,请确认您的客户端是否正确设置了连接选项。例如,在VS2022中,您可以使用以下命令来打开一个新的文件窗口并输入 "tcp://localhost:80":

    wsuitl.exe -n -p 80
    

    然后,打开文件资源管理器(右键点击窗口)并选择"新建" -> "项目"。接下来,创建一个名为main.cpp的新C++源文件,并在其中编写以下代码:

    #include <iostream>
    #include <string>
    #include <vector>
    #include <stdexcept>
    
    using namespace std;
    
    int main()
    {
        try
        {
            cout << "Hello, World!" << endl;
        }
        catch (const exception& e)
        {
            cerr << "An error occurred: " << e.what() << endl;
            return 1;
        }
    
        return 0;
    }
    

    请确保包含所有必要的库(如<iostream><string><vector>),并在main函数中加入上述代码。现在,您的程序应该可以成功连接到服务器并正常输出消息。 请注意,这个示例仅适用于VS2022 Winsock。在其他版本的Windows上,可能需要进行一些调整才能满足功能需求。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 4月7日
  • 创建了问题 4月7日

悬赏问题

  • ¥30 数字信号处理实验报告
  • ¥15 ensp路由器启动不了一直报#
  • ¥50 安卓10如何在没有root权限的情况下设置开机自动启动指定app?
  • ¥15 ats2837 spi2从机的代码
  • ¥200 wsl2 vllm qwen1.5部署问题
  • ¥100 有偿求数字经济对经贸的影响机制的一个数学模型,弄不出来已经快要碎掉了
  • ¥15 数学建模数学建模需要
  • ¥15 已知许多点位,想通过高斯分布来随机选择固定数量的点位怎么改
  • ¥20 nao机器人语音识别问题
  • ¥15 怎么生成确定数目的泊松点过程