Thread (2 messages) flat view 2 messages, 2 authors, 2011-02-20

Re: how to listen() on single IP address but very many ports?

From: Eric Dumazet <hidden>
Date: 2011-02-20 19:20:16

Le vendredi 18 février 2011 à 11:55 -0600, Chris Friesen a écrit :
I have an application team that needs to listen() for tcp connections on
many ports (and by many I mean pretty much all 64K ports).  However, the
connections are short-lived, and the number of active connections at any
given time is small.

Apparently when they tried this before on an older kernel the
performance of the naive "open 60K sockets and call listen()" solution
was not acceptable, so they used NAT with port mapping to direct all the
incoming packets to a single real port.  However, they now want to add
support for IPv6 and this solution won't work.

What's the recommended method for efficiently listening on this many
ports?  Should I be able to efficiently listen() on that many sockets
using epoll or similar?  If there isn't a way to do this, is there an
equivalent IPv6 workaround?

One possible solution that came up was to implement a PORT_ANY which
would match any incoming request that didn't already have an explicit
listener.  Even better would be a way to bind a single listening socket
to a range of ports.

Has anyone ever considered something like this?
I really dont see how listening to 60K sockets can be "not acceptable".

It just runs OK, at exactly same speed than 1 socket, if using epoll.

Only 'problem' could be memory usage, a bit more heavy of course, but
who cares ?


Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help