电子鸡 2021-12-07 19:39 采纳率: 0%
浏览 118

windows端C++UDP多线程编程,recvfrom函数不能阻塞,第一次报错0,之后一直报错10038,如何解决?

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图

下面是接收端的代码,发送端只有循环发送

#include<Winsock2.h>
#include<iostream>
#include<string>
#include<fstream>
#include<WinSock2.h>
#include<Windows.h>

#pragma comment(lib,"ws2_32.lib")
using namespace std;
///////////////////////////////////////////////////////
    WSADATA wsd;    // 初始化Socket的变量
    SOCKET s;        // 用于通信的Socket句柄
    SOCKADDR_IN sRecvAddr,sSendAddr;    // 分别为接收地址和发送地址
    USHORT uPort = 1401;                // 通信端口
    int nResult = 0,nSenderAddrSize = sizeof(sSendAddr);
///////////////////////////////////////////////////////
char recvBuf[1024]={0};
int recvlen=1024;
bool SEND=false;
///////////////////////////////////////////////////////

DWORD WINAPI recvThread(LPVOID lpParameter) {
    SOCKET s= (SOCKET)lpParameter;
    SOCKADDR_IN sRecvAddr,sSendAddr;
    int nSenderAddrSize = sizeof(sSendAddr);
    while (1) {
        if(SEND){
            sendto(s, "hello,too", 1024, 0, (sockaddr*)&sSendAddr, 50);
            SEND=false;
        }
    }
    system("pause");
    return 0;
}

int main() {

    // 初始化Socket2.2版本
    nResult = WSAStartup(MAKEWORD(2, 2), &wsd);
    if (nResult != NO_ERROR)
    {
        printf("WSAStartup failed:%d\n", WSAGetLastError());
        return 1;
    }

    // 创建一个Socket,SOCK_DGRAM表示UDP类型
    s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (s == INVALID_SOCKET)
    {
        printf("socket failed:%d\n", WSAGetLastError());
        return 1;
    }

    // 填充Socket接口
    sRecvAddr.sin_family = AF_INET;        // 地址协议,AF_INET支持TCP和UDP
    sRecvAddr.sin_port = htons(uPort);    // 通信端口,htons转为网络字节顺序
    sRecvAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);    // 接收任意地址数据

    // 绑定Socket至本机
    nResult = bind(s, (SOCKADDR *)&sRecvAddr, sizeof(sRecvAddr));
    if (nResult != 0){
        printf("bind failed:%d\n", WSAGetLastError());
        return 1;
    }

    HANDLE hThread=CreateThread(NULL,0,recvThread,(LPVOID)s,0,NULL);


    while(1){
      recvfrom(s, recvBuf, recvlen, 0, (SOCKADDR *)&s, &nSenderAddrSize);
        cout<<GetLastError()<<endl;
    }


    closesocket(s);
    WSACleanup();
    system("pause");
    return(0);
}

运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

1条回答 默认 最新

  • 「已注销」 2021-12-07 21:40
    关注

    recvfrom阻塞接收的问题,网不通时会一直等待,若改成非阻塞的,亦不可靠谱。

    可通过设置一个超时时间来实现

    评论

报告相同问题?

问题事件

  • 创建了问题 12月7日

悬赏问题

  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多