Linux/C udp发送方法
问题描述:
在C中发送UDP数据包的唯一方法是使用send/sendo/write/...调用。Linux/C udp发送方法
问题在于,对于每个数据包,我需要从用户空间执行新的调用。
有谁知道是否有一个功能,它允许像
send_packets(INT插座,为const char *缓冲区,INT PACKETSIZE)
这并不自动在缓冲区中的数据分割成包大小的packetSize(例如1472),然后将它们作为UDP数据包发送?
感谢
答
这个接口似乎并没有捕捉到你的意图,你不说有多少数据包产生。
不,我不认为有这样的电话。如果担心的主要问题是你想减少内核空间转换的用户空间数量,我不知道有更好的解决方案。
如果您只是对结构感到烦恼,这会给您的应用程序带来麻烦,请考虑创建一个实现多发送语义的专用线程,以便您的主线程可以通过一次调用就可以交出一堆数据。
答
您可以批处理原始数据包而不是更高级别的协议。低级API适用于像Wireshark这样的实用程序。
在Linux上,您可以修改内核以实现类似于recvmmsg()
的sendmmsg()
API,但是当我这样做时,由于接口实际使用的麻烦程度,我只记录了性能损失。
这样一个API的用户基础非常有限,就好像您真的想要高性能一样,只需转移到InfiniBand或使用由Solarflare(OpenOnload)或Mellanox提供的用户空间套接字API,这取决于其以太网接口上的10 GigE RDMA。
相似问题:http://stackoverflow.com/questions/631058/send-multiple-datagrams-using-a-single-send-call – 2011-06-13 15:34:31