Socket Reuse Issue

In the following code sample, I am explicitely setting a local endpoint for tracking purposes and then sending out a request.  While this works without issue the first time through, if I run the program again too quickly, I recieve the following exception:

System.Net.Sockets.SocketException: Only one use of each socket address (protocol/network address/port) is normally permitted

As you can see, I am closing out the connection in the Finally block but that does not appear to make a difference.  If you comment out the tester.Bind line you never get this error.

Can somebody please help?
Socket tester = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint thisEnd = new IPEndPoint(IPAddress.Any, 9736);
            tester.Bind(thisEnd);
            tester.Ttl = 255;

            try
            {
                tester.Connect(IPAddress.Parse("173.194.35.104"), 80);
                tester.Disconnect(true);
            }
            catch (Exception exc)
            {
                Console.WriteLine("Error with TCP Test:\n" + exc.ToString());
            }
            finally
            {
                if (tester != null && tester.Connected)
                {
                    tester.Disconnect(true);
                }
                if (tester != null)
                {
                    tester.Close();
                }
            }

Open in new window

ktolaAsked:
Who is Participating?
 
käµfm³d 👽Commented:
From http://blogs.msdn.com/b/dgorti/archive/2005/09/18/470766.aspx :

When a connection is closed, on the side that is closing the connection the 5 tuple
{ Protocol, Local IP, Local Port, Remote IP, Remote Port} goes into a TIME_WAIT state for 240 seconds by default.
0
 
ktolaAuthor Commented:
Yeah - I read that and then tried to change the Registry setting (actually added in the DWORD as it did not exist) but that did not change anything.  I just modified the code as follows and, for some reason, this appears to be working on the same port every time.
Socket tester = null;
            int startPort = 9729;
            IPEndPoint thisEnd;
            bool haveEndPt = false;

            while (!haveEndPt)
            {
                try
                {
                    tester = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    tester.ExclusiveAddressUse = false;
                    tester.Ttl = 255;
                    startPort += 1;
                    if (startPort > 9750)
                    {
                        haveEndPt = true;
                        throw new Exception("Unable to connect on any port from 9730 to 9750");
                    }
                    thisEnd = new IPEndPoint(IPAddress.Any, startPort);
                    tester.Bind(thisEnd);
                    haveEndPt = true;
                    Console.WriteLine("The selected TCP Handshake port was: " + startPort.ToString());
                    tester.Connect(IPAddress.Parse("173.194.35.104"), 80);
                    tester.Disconnect(true);
                }
                catch (SocketException sockX)
                {
                    //Console.WriteLine(sockX.ToString());
                }
                catch (Exception exc)
                {
                    Console.WriteLine("Error with TCP Test:\n" + exc.ToString());
                }
                finally
                {
                    if (tester != null && tester.Connected)
                    {
                        tester.Disconnect(true);
                    }
                    if (tester != null)
                    {
                        tester.Close();
                    }
                }
            }

Open in new window

0
 
ktolaAuthor Commented:
In playing around with the code, it appears that the following line:
tester.ExclusiveAddressUse = false;

Actually overcomes the issue and allows for multiple requests on the same connection.  I also had to make sure that the Disconnect was set to true:
tester.Disconnect(true);
 
0
 
käµfm³d 👽Commented:
Did you reboot the system after changing the registry?
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.