Re: zero copy for relay server
From: Eric Dumazet <hidden>
Date: 2011-03-28 16:52:32
Le lundi 28 mars 2011 à 21:57 +0530, Viral Mehta a écrit :
Hi,
I am implementing a particular application where
my application acts nothing but like Relay Server.
Relay server accepts connection from machine A.
It also accepts connection from Machine B.
Machine A and B are on different LAN/subnnets.
Now, there are two connections.
What server is supposed to do is RECV packets from machine A and SEND same
to machine B.
Pseudo Code is something like,
while(1)
{
recvagain:
n =3D recv(incoming_fd, &buf, 8192, ...)
if(n < 0)
goto recvagain;
send(outgoing_fd, &buf, n, ...);
}
Now the question is,
I want to avoid kernel-user copy for such application.
I found that a syscall like "sendfile"; I wanted to know if there is any
similar thing exists in-kernel which can take 2 socket descriptors....
If not, is it possible ? I would like to implement the same if someone
can suggest some pointers.
linux way (if you want to avoid netfilter stuff and use userland code)
is to use splice() system call, and a pipe between two sockets.
/* skeleton : must add error checking to exit the loop properly */
int fds[2];
pipe(fds);
while (1) {
splice(incoming_fd, NULL, fds[1], NULL, 65536, 0);
splice(fds[0], NULL, outgoing_fd, NULL, 65536, 0);
}
This way, messages dont cross kernel<>user boundary.
The pipe is acting as a buffer between the two sockets.