Wierd listen/connect: accept queue never fills up

Philippe Troin (phil@fifi.org)
27 Nov 2002 18:58:33 -0800


[Andi, I've CC'ed you since you're listed as the author of the `new
listen' code in net/ipv4/tcp_ipv4.c]

Seen on linux 2.4.20rc2.

This program is always able to establish new connections to itself:
the accept queue never fills up and connections always succeed
(although they take quite some time after the first four):

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(void)
{
int fd;
struct sockaddr_in sin;
socklen_t sinlen;

if ((fd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
perror("socket"), exit(1);

sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
sin.sin_port = htons(0);
if (bind(fd, (struct sockaddr*)&sin, sizeof(sin)) == -1)
perror("bind"), exit(1);
if (listen(fd, 1) == -1)
perror("listen"), exit(1);

sinlen = sizeof(sin);
getsockname(fd, (struct sockaddr*)&sin, &sinlen);

while (1)
{
int fdc;

if ((fdc = socket(PF_INET, SOCK_STREAM, 0)) == -1)
perror("socket"), exit(1);
printf("%c", connect(fdc, (struct sockaddr*)&sin, sinlen) == -1
? 'F' : '.');
fflush(stdout);
}

exit(0);
}

I've tried enabling and disabling tcp_syncookies, without any effect.

The same program starts returning errors after two successful connects
on Solaris and one on HP-UX. Linux keeps returning new connections...

Phil.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/