Multiple ip-numbers in jails (fixed INADDR_ANY behaviour).
Bernd Walter
ticso at cicely9.cicely.de
Wed Apr 16 11:07:41 PDT 2003
On Wed, Apr 16, 2003 at 03:34:38PM +0100, Jan Grant wrote:
> You can't have multiple processes listen on the same address and port,
> but you CAN have one listen on a specific IP and port and another listen
> on INADDR_ANY and the same port. By extension, you'd expect a _more
> specific_ binding of INADDR_ANY to override a more general one.
You *can* have multiple processes listen on the same address and port.
1) SO_REUSEPORT
2) You can pass a listen filedescriptor between processes (fork, UDS).
[74]cicely30> cat foo.c
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main (int argc, char *argv[]) {
int listenfd, connfd;
struct sockaddr_in cliaddr, servaddr;
socklen_t clilen;
int val;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(7000);
val = 1;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
listen(listenfd, 2);
for (;;) {
clilen = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen);
/* do something */
close(connfd);
}
}
[75]cicely30> gcc -o foo foo.c
[76]cicely30> ./foo &
[1] 35763
[77]cicely30> ./foo &
[2] 35764
[78]cicely30> netstat -an | grep 7000
tcp4 0 0 *.7000 *.* LISTEN
tcp4 0 0 *.7000 *.* LISTEN
--
B.Walter BWCT http://www.bwct.de
ticso at bwct.de info at bwct.de
More information about the freebsd-hackers
mailing list