Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 Oct 2004 13:45:15 -0700
From:      Julian Elischer <julian@elischer.org>
To:        Ollie Cook <ollie@uk.clara.net>
Cc:        freebsd-net@freebsd.org
Subject:   Re: Efficient copying between sockets
Message-ID:  <4182ABDB.7040104@elischer.org>
In-Reply-To: <20041029123506.GG19662@mutare.noc.clara.net>
References:  <20041029123506.GG19662@mutare.noc.clara.net>

next in thread | previous in thread | raw e-mail | index | archive | help


Ollie Cook wrote:

>Good afternoon,
>
>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?
>

you can do it entirely in the kernel if you write a program to configure 
two netgraph ksockets to each other

>
>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.
>
>Yours,
>
>Ollie
>
>  
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4182ABDB.7040104>