【发布时间】:2021-12-12 05:22:46
【问题描述】:
我正在编写 WIN32 代码以在 UDP 套接字上发送数据。为了获得更好的性能,使用多个缓冲区调用 WSASend()。但结果是这些缓冲区中的所有数据都合并为一个 UDP 数据包。我需要为每个缓冲区中的数据提供单独的 UDP 数据包。有没有办法做到这一点? WIN32 不支持 Linux 中的 sendmmsg() ,我相信它可以满足我的需要。谢谢!
'''
#define MAX_UDP_PKT_IN_MSG 5
CHAR userData[MAX_UDP_PKT_IN_MSG][10];
WSABUF buf[MAX_UDP_PKT_IN_MSG];
DWORD pktSent = 0;
/* init socket for UDP */
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
// calls bind(), connect()
...
for (int i = 0; i < MAX_UDP_PKT_IN_MSG; i ++) {
buf[i].len = 10;
buf[i].buf = &userData[i][0];
}
rc = WSASend(sock, buf, MAX_UDP_PKT_IN_MSG, &pktSent, 0, 0, 0);
...
'''
【问题讨论】:
-
您要求的内容每次发送需要 1 个缓冲区。
WSASend()只执行 1 次发送,因此合并缓冲区,而不是 N 次发送 N 个缓冲区。文档中的这条语句暗示了这一点:“对于面向消息的套接字[即UDP],不要超过底层提供者的最大消息大小,可以获取通过获取套接字选项SO_MAX_MSG_SIZE的值。如果数据太长而无法以原子方式通过底层协议,则返回错误WSAEMSGSIZE,并且不传输任何数据。" 这意味着所有提交的缓冲区被视为 1 条消息 -
@RemyLebeau 你是对的!有什么方法可以在一个呼叫中发送多个数据包。
-
我认为您的意思是消息,而不是数据包。但无论如何,不,我不知道有任何类似于
sendmmsg()用于 Windows 套接字的函数。
标签: windows sockets winapi network-programming udp