I have a 486dx4-10 with 16 meg of ram and a 3c509b on an ethernet link.
The bug is this: I have a program that accepts tcp/ip socket connections from
other hosts, but if the pipe is one way the sockets hang.
I use the accept() call to connect the socket. A connection request arrives,
and the accept call sends out an ACK. If the ACK never gets to the
destination, or for some reason the final ACK in the three way handshake never
arrives, the accept call refuses to accept any more connections. The backlog
is set at three.
Usually what happens is someone tries to log on, but since the connection isnt
made they try over and over until the connection queue is full. At this point
in time no other connections are accepted until the first person times out,
which can be on the order of 30 minutes.
Closing the socket does not fix this. The socket remains in the SYN_RECV state
until either I kill the accepting program or the socket times out. More often
than not the network will fix itself after ten minutes and the socket will
discover that it no longer is attached to anything.
I know that most unix machines do not do this; However I have seen it happen
on three different versions of linux, 1.2.8, .9something, and 1.2.13 redhat.
If anyone can give me a hint on how to hack this *out of my kernel, it
would be greatly appreciated. I can find no information on it.
Thanks in advance,