Solved

Socket Reuse Issue

Posted on 2010-11-10
4
929 Views
Last Modified: 2012-05-10
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

0
Comment
Question by:ktola
  • 2
  • 2
4 Comments
 
LVL 74

Accepted Solution

by:
käµfm³d   👽 earned 500 total points
ID: 34108242
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
 

Author Comment

by:ktola
ID: 34108294
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
 

Author Comment

by:ktola
ID: 34108327
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
 
LVL 74

Expert Comment

by:käµfm³d 👽
ID: 34108329
Did you reboot the system after changing the registry?
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

We all know that functional code is the leg that any good program stands on when it comes right down to it, however, if your program lacks a good user interface your product may not have the appeal needed to keep your customers happy. This issue can…
Wouldn’t it be nice if you could test whether an element is contained in an array by using a Contains method just like the one available on List objects? Wouldn’t it be good if you could write code like this? (CODE) In .NET 3.5, this is possible…
In this tutorial you'll learn about bandwidth monitoring with flows and packet sniffing with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're interested in additional methods for monitoring bandwidt…
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now