You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免调用WSASend时多个缓冲区数据合并为单个UDP数据包

问题根因

WSASend 传入多块WSABUF的设计为*聚集写(gather write)*模式,仅会将所有缓冲区内容拼接为单个UDP报文发送,和你期望的每个缓冲区对应独立UDP包的需求不匹配。Windows平台没有Linux下sendmmsg的直接等价接口,但有多种适配方案可以满足需求。

实现方案

方案1:使用TransmitPackets接口(最优,最接近sendmmsg能力)

TransmitPackets是Winsock原生提供的批量报文发送接口,一次系统调用即可提交多个独立报文的发送请求,内核态批量处理,大幅减少用户态/内核态切换开销,性能接近Linux的sendmmsg。
适用场景:高性能发送场景,对小包吞吐要求较高的业务。

注意:使用该接口需要引入头文件mswsock.h,链接静态库mswsock.lib
代码示例:

#define MAX_UDP_PKT_IN_MSG 5

CHAR userData[MAX_UDP_PKT_IN_MSG][10];
// 定义TransmitPackets所需的报文数组
TRANSMIT_PACKETS_ELEMENT pktArr[MAX_UDP_PKT_IN_MSG];
DWORD bytesSent = 0;

/* 初始化UDP套接字,原有bind、connect逻辑不变 */
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
// bind()、connect()原有逻辑
...

for (int i = 0; i < MAX_UDP_PKT_IN_MSG; i++) {
    // 标记元素为内存缓冲区类型
    pktArr[i].dwElFlags = TP_ELEMENT_MEMORY;
    // 单个UDP报文长度
    pktArr[i].cLength = 10;
    // 报文缓冲区指针
    pktArr[i].pBuffer = userData[i];
}

// 一次调用发送所有独立UDP报文
BOOL rc = TransmitPackets(
    sock,
    pktArr,
    MAX_UDP_PKT_IN_MSG,
    0,
    NULL, // 同步调用传NULL,异步场景可传入OVERLAPPED结构
    0
);

方案2:批量提交重叠IO的WSASend请求

如果你的服务已经基于IO完成端口(IOCP)搭建了异步架构,可以一次性提交多个单缓冲区的WSASend重叠请求,内核会批量处理这些请求,相比循环同步调用WSASend性能提升明显。
适用场景:已经采用IOCP异步架构的服务。
代码示例:

#define MAX_UDP_PKT_IN_MSG 5

CHAR userData[MAX_UDP_PKT_IN_MSG][10];
// 每个发送请求对应独立的OVERLAPPED结构和WSABUF,注意生命周期需维持到发送完成
typedef struct {
    OVERLAPPED ol;
    WSABUF buf;
} SendOperation;

SendOperation sendOps[MAX_UDP_PKT_IN_MSG];
DWORD dummySent;

for (int i = 0; i < MAX_UDP_PKT_IN_MSG; i++) {
    ZeroMemory(&sendOps[i].ol, sizeof(OVERLAPPED));
    sendOps[i].buf.len = 10;
    sendOps[i].buf.buf = userData[i];
    // 提交异步单包发送请求
    WSASend(sock, &sendOps[i].buf, 1, &dummySent, 0, &sendOps[i].ol, NULL);
}
// 后续在IOCP工作线程中处理发送完成通知即可

方案3:循环调用WSASend(最简单,低吞吐场景适用)

如果发送量不大,不需要极致性能,直接循环每次发送1块缓冲区即可,代码改动最小。
适用场景:测试场景、低发包率场景。
代码示例:

DWORD pktSent;
for (int i = 0; i < MAX_UDP_PKT_IN_MSG; i++) {
    WSASend(sock, &buf[i], 1, &pktSent, 0, NULL, NULL);
}

内容的提问来源于stack exchange,提问作者Yan x

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:45:07