UDP通信IP与端口配置正确仍出现10049错误的排查问询
问题分析与解决
10049错误的根本原因
你绑定套接字时用了192.168.0.69,但这个IP是对方设备的地址,不是运行你代码的本机网卡IP。Winsock不允许绑定一个不属于本机的IP,所以抛出10049(WSAEADDRNOTAVAIL)错误。而Ezterm能正常工作,是因为它默认绑定了0.0.0.0(代表监听所有本机网卡接口),不管数据发往本机哪个IP,只要端口匹配就能收到。
修正方案
方案一:绑定本机实际IP
找到你本机在局域网的IP(比如192.168.0.xx),替换代码里的inet_addr("192.168.0.69")。
方案二:绑定所有接口(推荐)
用INADDR_ANY代替指定IP,这样套接字会监听本机所有可用的网卡接口,无需关心本机具体IP:
serverHint.sin_addr.S_un.S_addr = INADDR_ANY;
代码里的其他严重问题
你的while(true)循环存在资源泄漏:每次循环都重新初始化Winsock、创建套接字,却没有正确关闭套接字。正确的做法是把WSA初始化、套接字创建和绑定放在循环外,循环内只做接收操作,程序退出时再清理资源。
修正后的完整代码示例
DWORD WINAPI socketRead(void *lpVoid) { // UDP socket WSADATA data_s; WORD version = MAKEWORD(2, 2); // socket start - 只初始化一次 int wsok = WSAStartup(version, &data_s); if (wsok != 0) { cout << "Can't start Winsock!" << wsok; return 0; } cout << "start Winsock!\n"; // 创建套接字 - 只创建一次 SOCKET in = socket(AF_INET, SOCK_DGRAM, 0); if (in == INVALID_SOCKET) { cout << "Can't create socket!" << WSAGetLastError() << endl; WSACleanup(); return 0; } // socket bind - 只绑定一次 SOCKADDR_IN serverHint = {}; memset(&serverHint, 0, sizeof(serverHint)); serverHint.sin_family = AF_INET; // IPv4 serverHint.sin_addr.S_un.S_addr = INADDR_ANY; // 监听所有接口 serverHint.sin_port = htons(1480); if (bind(in, (sockaddr *)&serverHint, sizeof(serverHint)) != SOCKET_ERROR) { cout << "bind socket!\n"; } else { cout << "can't bind socket!" << WSAGetLastError() << endl; closesocket(in); WSACleanup(); return 0; } // 循环接收数据 char buffer[1024]; SOCKADDR_IN clientAddr; int clientAddrSize = sizeof(clientAddr); while (true) { int recvLen = recvfrom(in, buffer, sizeof(buffer)-1, 0, (sockaddr*)&clientAddr, &clientAddrSize); if (recvLen == SOCKET_ERROR) { cout << "Receive error!" << WSAGetLastError() << endl; continue; } buffer[recvLen] = '\0'; // 可以判断发送方IP是否是192.168.0.69 char clientIP[20]; inet_ntop(AF_INET, &clientAddr.sin_addr, clientIP, sizeof(clientIP)); if (strcmp(clientIP, "192.168.0.69") == 0) { cout << "Received from 192.168.0.69: " << buffer << endl; } } // 实际程序退出时执行以下清理(这里循环不会退出,仅作示例) closesocket(in); WSACleanup(); return 0; }
关于额外配置的说明
不需要额外配置系统,只要修正代码中的绑定IP问题即可。如果之后还是有问题,可以检查:
- 本机防火墙是否允许1480端口的UDP入站连接
- 1480端口是否被其他程序占用(可以用
netstat -ano | findstr :1480命令查看)
内容的提问来源于stack exchange,提问作者전채이
相关产品推荐
相关产品推荐

