Efficient copying between sockets
ollie at uk.clara.net
Fri Oct 29 05:35:27 PDT 2004
I am currently writing a potentially high bandwidth (think fileserver)
application which will proxy data from one PF_INET socket to another (no reason
it has to be PF_INET, but that's how the application stands).
At the moment this is implemented as follows (in pseudo-C; no error-checking
for brevity and clarity):
written_bytes = 0;
read_bytes = read(sock_src, buffer, sz_buffer);
while (written_bytes < read_bytes)
written_bytes -= write(sock_dst, buffer, read_bytes - written_bytes)
I am wondering if there is a more efficient approach to this which might avoid
copying data into a userspace buffer, and then writing it back to the kernel?
In actual fact, I know in advance exactly how many bytes need to be copied from
one socket to the other, so if there was any way of doing something like:
socket_redirect(sock_src, sock_dst, bytes_to_copy);
it would be ideal. However I'd be very surprised if such a trivial way to do
that did actually exist.
If anyone has any advice at all on a more efficient way to copy data between
sockets I'd be very glad to hear about it. The software is very much prototype
at the moment, but I'd like to make it as efficient as possible from the
beginning and this seems like a prime area for optimisation.
Ollie Cook Systems Architect, Claranet UK
ollie at uk.clara.net +44 20 7685 8065
More information about the freebsd-net