在C中发送UDP数据包的唯一方法是使用send / sendo / write / ...调用 .
这些问题是,对于每个数据包,我需要从用户空间执行新的调用 .
有谁知道是否有一个允许类似的功能
send_packets(int socket,const char * buffer,int packetSize)
哪个会自动将缓冲区中的数据拆分为大小为packetSize的数据包(例如1472),然后将它们作为UDP数据包发送?
谢谢
您可以批量原始数据包,但不能批量更高级别的协低级API适用于Wireshark等实用程序 .
在Linux上,您可以修改内核以实现类似于 recvmmsg() 的 sendmmsg() API,但是当我这样做时,由于界面实际使用起来有多麻烦,我只记录了性能损失 .
recvmmsg()
sendmmsg()
这种API的用户群非常有限,好像你真的想要高性能只需转移到InfiniBand或使用Solarflare(OpenOnload)或Mellanox提供的用户空间套接字API,这取决于他们的10 GigE RDMA over Ethernet接口 .
该接口似乎没有捕获您的意图,您没有说明要生成多少个数据包 .
不,我认为没有这样的电话 . 如果主要关注点是你想减少用户空间到内核空间转换的数量,我不知道更好的解决方案 .
如果您对提供应用程序的结构感到恼火,可以考虑创建一个实现多发送语义的专用线程,这样您的主线程就可以通过一次调用来传递大量数据 .
2 回答
您可以批量原始数据包,但不能批量更高级别的协低级API适用于Wireshark等实用程序 .
在Linux上,您可以修改内核以实现类似于
recvmmsg()
的sendmmsg()
API,但是当我这样做时,由于界面实际使用起来有多麻烦,我只记录了性能损失 .这种API的用户群非常有限,好像你真的想要高性能只需转移到InfiniBand或使用Solarflare(OpenOnload)或Mellanox提供的用户空间套接字API,这取决于他们的10 GigE RDMA over Ethernet接口 .
该接口似乎没有捕获您的意图,您没有说明要生成多少个数据包 .
不,我认为没有这样的电话 . 如果主要关注点是你想减少用户空间到内核空间转换的数量,我不知道更好的解决方案 .
如果您对提供应用程序的结构感到恼火,可以考虑创建一个实现多发送语义的专用线程,这样您的主线程就可以通过一次调用来传递大量数据 .