In an application I am developing I use splice
on Linux for socket-to-socket data transfer.
- Do other operating systems (specifically at least Windows, OS X and FreeBSD) implement
splice
or an equivalent solution? - Is it possible to imitate socket-to-socket data
splice
ing on Windows withsendfile
¹ +memmap
¹?
¹ Both exist on Windows under different names which I do not remember.
Update
You can see the performance improvements of splice
vs user space buffers on Linux.
DF
,DR
,F
,MF
,MR
are my application in its different tunneling modes,NX
is NGINX web server-p+t
uses the Linux system callsplice
+p-t
uses a portable implementation with user space buffers+p+t
uses a portable implementation with user space buffers and multiple OS threads- bars represent throughput in gigaBYTE s per second
- a single 1 gigabyte (1048576000 bytes) file was requsted 4 times by 4 concurrent clients
OpenBSD has
sosplice
andsomove
: http://www.openbsd.org/cgi-bin/man.cgi?query=sospliceTransmitFile comes to mind as one such way in winsock to stream from one file handle to a socket, but I an not certain if that will help you as it's for streaming from file->disk. You might be able to use it with a memory mapped file handle.
I've heard a few people in the past speak of "kernel mode" as the way to speed up some echo and simple server operations, but I've never done it.
Some links on kernel mode 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