2

I have a program that sometime misses to close a tcp connection.

After the program has ended I can see that the port is taken. TCPViewer shows "non-existent" in the "Process" column.

If i try to "End process" or "Close connection" nothing happens.

If i reboot the server the port is released. But how can I tell Windows to release this port without a reboot?

SOLUTION: It was dw20.exe (Microsoft Error Reporting) that was holding it back.

Stig
  • 21

1 Answers1

1

The operating system will automatically close all TCP connections when a process exits1.

What you are seeing is probably a connection in the TIME-WAIT state ("...represents waiting for enough time to pass to be sure the remote peer received the acknowledgment of its connection termination request").

This should not be a problem for clients, as a host can establish multiple TCP connections to the same remote host:port.

For a server, SO_REUSEADDR can be used.

What exactly does SO_REUSEADDR do?

This socket option tells the kernel that even if this port is busy (in the TIME_WAIT state), go ahead and reuse it anyway. If it is busy, but with another state, you will still get an address already in use error. It is useful if your server has been shut down, and then restarted right away while sockets are still active on its port. You should be aware that if any unexpected data comes in, it may confuse your server, but while this is possible, it is not likely.

It has been pointed out that "A socket is a 5 tuple (proto, local addr, local port, remote addr, remote port). SO_REUSEADDR just says that you can reuse local addresses. The 5 tuple still must be unique!" by Michael Hunter (mphunter@qnx.com). This is true, and this is why it is very unlikely that unexpected data will ever be seen by your server. The danger is that such a 5 tuple is still floating around on the net, and while it is bouncing around, a new connection from the same client, on the same system, happens to get the same remote port. This is explained by Richard Stevens in ``2.7 Please explain the TIME_WAIT state.''.

See also this StackOverflow answer: Using SO_REUSEADDR - What happens to previously open socket?


1 Technically, when all handles to that connection are destroyed. Multiple processes may own a file handle.

u1686_grawity
  • 452,512