Linux / C UDP发送方法

3

在C中发送UDP数据包的唯一方法是使用send/sendo/write等调用。

问题在于,对于每个数据包,我需要从用户空间执行一个新的调用。

有没有人知道是否有一种函数可以允许像下面这样的操作:

send_packets( int socket, const char* buffer, int packetSize )

它会自动将缓冲区中的数据分割成大小为packetSize(例如1472)的数据包,然后将它们作为UDP数据包发送?

谢谢


1
类似问题:https://dev59.com/D0bRa4cB1Zd3GeqP4NUd - Steve-o
2个回答

1

你可以批量处理原始数据包,但不能处理更高级别的协议。低级别的API适用于像Wireshark这样的实用工具。

在Linux上,你可以修改内核来实现类似于recvmmsg()sendmmsg() API,但当我尝试时,由于接口使用起来非常繁琐,只注册了性能损失。

这种API的用户群体相当有限,如果你真的想要高性能,只需转向InfiniBand或使用Solarflare(OpenOnload)或Mellanox提供的用户空间套接字API,该API依赖于它们的10 GigE RDMA over Ethernet capable接口。


0

那个接口似乎不能满足你的意图,因为你没有说明要生成多少个数据包。

而且,我不认为有这样的调用。如果主要关注点是想减少用户空间到内核空间的转换次数,我不知道有更好的解决方案。

如果你只是对这种结构感到烦恼,考虑创建一个专用线程来实现多发送语义,这样你的主线程就可以通过单个调用传递一堆数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接