在C中发送UDP数据包的唯一方法是使用send/sendo/write等调用。
问题在于,对于每个数据包,我需要从用户空间执行一个新的调用。
有没有人知道是否有一种函数可以允许像下面这样的操作:
send_packets( int socket, const char* buffer, int packetSize )
它会自动将缓冲区中的数据分割成大小为packetSize(例如1472)的数据包,然后将它们作为UDP数据包发送?
谢谢
在C中发送UDP数据包的唯一方法是使用send/sendo/write等调用。
问题在于,对于每个数据包,我需要从用户空间执行一个新的调用。
有没有人知道是否有一种函数可以允许像下面这样的操作:
send_packets( int socket, const char* buffer, int packetSize )
它会自动将缓冲区中的数据分割成大小为packetSize(例如1472)的数据包,然后将它们作为UDP数据包发送?
谢谢
你可以批量处理原始数据包,但不能处理更高级别的协议。低级别的API适用于像Wireshark这样的实用工具。
在Linux上,你可以修改内核来实现类似于recvmmsg()
的sendmmsg()
API,但当我尝试时,由于接口使用起来非常繁琐,只注册了性能损失。
这种API的用户群体相当有限,如果你真的想要高性能,只需转向InfiniBand或使用Solarflare(OpenOnload)或Mellanox提供的用户空间套接字API,该API依赖于它们的10 GigE RDMA over Ethernet capable接口。
那个接口似乎不能满足你的意图,因为你没有说明要生成多少个数据包。
而且,我不认为有这样的调用。如果主要关注点是想减少用户空间到内核空间的转换次数,我不知道有更好的解决方案。
如果你只是对这种结构感到烦恼,考虑创建一个专用线程来实现多发送语义,这样你的主线程就可以通过单个调用传递一堆数据。