我正在编写一个网络应用程序,它将在一对套接字之间传输数据。
每当源套接字中有一些数据可用时,它就会将其传输到目标套接字,反之亦然。但在这里我正在寻找最有效的方法。
到目前为止,我找到了两种方法:
read()
和 write()
调用在套接字之间传输数据。splice()
和管道从内核空间传输套接字缓冲区。在第一种方法中,我每次都必须将数据复制到用户空间缓冲区,在第二种方法中,我必须将数据从源套接字复制到管道,然后从管道复制到目标套接字。因为
splice()
的描述符之一必须是管道。同样,在 sendfile()
的情况下,其描述符之一必须是文件。
我想知道是否有任何其他零复制数据传输机制可用于在套接字之间移动数据。
解决方案是 SOCKMAP - 没有系统调用成本,也没有用户空间/内核空间复制。
在这里找到一篇文章https://blog.cloudflare.com/sockmap-tcp-splicing-of-the-future/详细解释了