4

在我开发的应用程序中,我在Linux上使用splice进行套接字到套接字的数据传输。其他操作系统是否实现Linux系统调用拼接?

  1. 做其他操作系统(特别至少是Windows,OS X和FreeBSD)实施splice或等效的解决方案?
  2. 是否有可能模仿在Windows上的插座到插座数据splicesendfile 1 + memmap

¹无论在Windows下我不记得了不同的名称存在。


更新

你可以看到splice的性能改进VS在Linux用户空间的缓冲区。

go

  • DFDRFMFMR是我在不同隧道模式的应用,NX是NGINX Web服务器
  • -p+t使用Linux系统调用splice
  • +p-t使用用户空间缓冲区的便携式实现
  • +p+t使用便携式实现与用户空间缓冲液和多个OS线程
  • 扶手的千兆字节表示可以通过每秒
  • 个单个1千兆字节(1048576000个字节)文件是由4个并发客户端requsted 4次
+1

我对此有一些想法。但在我回答之前,让我问,“你真的想做什么?”您是否试图将数据流或数据包从一个套接字回显到另一个套接字上?在发送数据之前你需要检查数据吗? – selbie

+0

回声只回声。我正在研究一种名为[PortFusion]的简单隧道解决方案(http://fusion.corsis。eu),它不需要检查数据流(但是如果有的话,我可以切换到将数据带到用户空间的便携式实现)。 –

+0

@selbie我只是添加了一张图表来说明为什么我对其他操作系统中的'splice'等价物感兴趣。 –

回答

0

TransmitFile想到winsock中的一种方式是从一个文件句柄传输到套接字,但我不确定它是否能帮助您,因为它是从文件 - >磁盘进行流式传输的。您可能可以使用它与memory mapped file句柄。

我听过一些人在过去说过“内核模式”作为加快一些回声和简单的服务器操作的方式,但我从来没有这样做过。

在内核模式Winsock的一些链接:

http://blogs.msdn.com/b/wndp/archive/2006/02/24/introduction-to-winsock-kernel-wsk.aspx

http://msdn.microsoft.com/en-us/library/windows/hardware/ff571084(v=vs.85).aspx

+0

TransmitFile似乎相当'文件 - >套接字'对我:),我都尝试内存映射文件,但部分接收数据从套接字直接内存映射文件,而没有触及它在用户空间缺少,零-socket-> File'类型的复制函数。 –