(Winsock) UDP 接收工作正常,但同一套接字的发送失败
(Winsock) UDP receive works but send fails for same socket
我在Windows中使用UDP套接字时遇到问题。我有一个单独的应用程序,我正在尝试与端口 1625 上的输出通信,并在端口 26027 上接收。我尝试制作一个简单的可执行文件,读取一条消息并发送一条消息。读取工作正常,但发送最终出现 WSAEADDRNOTAVAIL (10049( 错误。
为了进行故障排除,我还在同一台机器上尝试了Linux中的等效代码(使用Linux的Windows子系统(,并且工作正常。所以我无法弄清楚问题是什么。我也尝试禁用Windows防火墙,但这并没有区别。任何建议将不胜感激。
Windows Visual C++代码:
#pragma comment(lib, "Ws2_32.lib")
#include <iostream>
#include <WS2tcpip.h>
#define MAXLINE 1024
int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
// Define local port address.
sockaddr_in local_port;
memset(&local_port, 0, sizeof(local_port));
local_port.sin_family = AF_INET;
local_port.sin_addr.s_addr = INADDR_ANY;
local_port.sin_port = htons(1625);
// Bind local socket.
int socket_id = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
bind(socket_id, (const struct sockaddr *)&local_port, sizeof(local_port));
// Receive UDP Port message.
char in_buffer[MAXLINE];
int num_bytes = recv(socket_id, (char *)in_buffer, MAXLINE, 0);
in_buffer[num_bytes] = ' ';
printf("Received : %sn", in_buffer);
// Set up send destination port.
sockaddr_in dest_port;
memset(&dest_port, 0, sizeof(dest_port));
dest_port.sin_family = AF_INET;
dest_port.sin_addr.s_addr = INADDR_ANY;
dest_port.sin_port = htons(26027);
// Send UDP message to specific UDP port.
char out_buffer[] = "Test message";
int result = sendto(
socket_id, out_buffer, strlen(out_buffer), 0, (struct sockaddr *)&dest_port, sizeof(dest_port));
printf("Send result : %d -- WSA Error : %dn", result, WSAGetLastError());
closesocket(socket_id);
return 0;
}
运行此可执行文件的终端输出为:
Received : 5e4009df*755=-0.0028:761=0.6942
Send result : -1 -- WSA Error : 10049
WSL linux C++代码(除了 WSA 包含和错误输出之外的相同源代码(:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define MAXLINE 1024
int main()
{
// Define local port address.
sockaddr_in local_port;
memset(&local_port, 0, sizeof(local_port));
local_port.sin_family = AF_INET;
local_port.sin_addr.s_addr = INADDR_ANY;
local_port.sin_port = htons(1625);
// Bind local socket.
int socket_id = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
bind(socket_id, (const struct sockaddr *)&local_port, sizeof(local_port));
// Receive UDP Port message.
char in_buffer[MAXLINE];
int num_bytes = recv(socket_id, (char *)in_buffer, MAXLINE, 0);
in_buffer[num_bytes] = ' ';
printf("Received : %sn", in_buffer);
// Set up send destination port.
sockaddr_in dest_port;
memset(&dest_port, 0, sizeof(dest_port));
dest_port.sin_family = AF_INET;
dest_port.sin_addr.s_addr = INADDR_ANY;
dest_port.sin_port = htons(26027);
// Send UDP message to specific UDP port.
char out_buffer[] = "Test message";
int result = sendto(
socket_id, out_buffer, strlen(out_buffer), 0, (struct sockaddr *) &dest_port, sizeof(dest_port));
printf("Send result : %dn", result);
close(socket_id);
return 0;
}
运行此可执行文件的终端输出为:
Received : 5e4009df*755=-0.0028:761=0.6942
Send result : 12
我还可以验证通过此 Linux 实现到端口 26027 的输出是否被其他应用程序接收,也可以在 Wireshark 中看到它。
编辑:
在雷米下面的回答之后,我能够按照下面的评论让它工作。要澄清我的网络:
如果我使用 Wireshark 查看它,我的网络现在看起来像:
127.0.0.1 UDP 50223 → 1625 Len=32
127.0.0.1 UDP 1625 → 26027 Len=12
我的节点绑定到 1625 的地方,它可以从某个未知端口号(在本例中为 50223(recv()
UDP,并sendto()
端口 26027。
您不能将recv()
与 UDP 套接字一起使用,除非您首先调用connect()
以将对等方的 IP/端口静态分配给套接字,而您没有这样做。所以recv()
会失败,但你没有检查这一点。您需要改用recvfrom()
。
此外,无论如何,您都无法按原样将数据包发送到INADDR_ANY
(0.0.0.0(。这就是您收到发送错误的原因。
发送函数
WSAEADDRNOTAVAIL
远程地址不是有效的地址,例如ADDR_ANY。
窗口套接字错误代码
WSAEADDRNOTAVAIL
10049无法分配请求的地址。请求的地址在其上下文中无效。这通常是由于尝试绑定到对本地计算机无效的地址而导致的。当远程地址或端口(例如,地址或端口 0(无效时,连接、发送、WSAConnect、WSAJoinLeaf 或 WSASendTo 也可能导致此问题。
您需要发送到实际的 IP/端口,例如发送到recvfrom()
收到数据包时报告的对等方 IP/端口。
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 为什么我在蓝牙连接()上收到"java.io.IOException:读取失败,套接字可能关闭或超时,读取re
- Python 3 套接字和 QTcpsocket (c++) 之间的通信失败
- Windows 套接字和身份验证构建在包含 Poco-Library 时失败
- 连接到套接字失败 - 错误编号 88 (CPP)
- QUdp套接字绑定失败
- TCP 服务器套接字打开失败C++
- C++ 对 nodejs 服务器的 POST 请求失败(基于套接字)
- C/C++ 套接字:如果我在 IPv6 TCP 连接之前执行任何操作,则连接将失败
- 使用 MSG_DONTWAIT 的 C UDP 接收套接字总是失败
- 为什么套接字(AF_INET、SOCK_DGRAM、IPPROTO_UDP)会失败
- Asio UDP 套接字接收失败
- 为什么套接字在gdb下失败
- NVIDIA 驱动程序使套接字在接受时失败
- 编译使用 libcxx 的套接字函数 bind() 的代码失败
- 将SO_BROADCAST设置为套接字失败,并显示"参数无效"
- C++套接字编程:sendto()和recvfrom()错误代码10038和in 'server'绑定失败,10038
- 如果cpp-linux中的套接字fd超过1024,则recv失败
- 如何在连接失败后清理套接字