BUG: Starting and Stopping a Winsock Server Using SO_REUSEADDR
Article ID: 177074
Article Last Modified on 9/23/2005
APPLIES TO
- Microsoft Windows NT Server 4.0 Standard Edition
- Microsoft Windows NT Workstation 4.0 Developer Edition
- Microsoft Windows 95
This article was previously published under Q177074
SYMPTOMS
To close a Winsock server and rebind a new server to its old port you need
to employ setsockopt() on the server socket with SO_REUSEADDR. However,
this becomes problematic if the server spawned incoming clients into child
processes for handling. If any child processes are left open with their
socket connection intact, any future client connection requests to any new
server will be forcefully refused (WSAECONNREFUSED).
CAUSE
When the server calls closesocket(), the Windows NT TCP/IP address object
connect handler address is set to NULL, which causes TCP/IP to send a
TCP/IP Reset (RST) when future clients attempt to connect to the server's
port number.
When a new server is created and reopens the same port, this causes the
Windows NT TCP/IP driver to create a duplicate address object with a valid
connect handler address. However, connection requests are validated against
the old TCP/IP address object, which still has a NULL connect handler.
The end result is that all future client connection requests are forcefully
refused (WSAECONNREFUSED) as long as child processes from the original
server maintain their socket connections through the original NT TCP/IP
address object. Once they all close, the original object is destroyed and
normal operation resumes.
STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed
at the beginning of this article. We are researching this bug and will post
new information here in the Microsoft Knowledge Base as it becomes
available.
REFERENCES
For additional information, please see the following article in the
Microsoft Knowledge Base:
166846 Cannot Reconnect to TN3270 Server with Close Listen Sockets
Additional query words: SO_REUSEADDR
Keywords: kbbug kbwinsock kbqfe kbnetwork kbip kbhotfixserver KB177074