473,397 Members | 2,028 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,397 software developers and data experts.

Socket dont really close. Please help microsoft MVP!

AA
This is making me crazy!!

Please, if some body can help me.

I'm testing a ver simple socket client.
In my test I just open and close a connection (in a loop) to my local IIS
server (port 80)

using System.Net.Sockets;

for (int I = 0; I < 5000; I++)
{
TcpClient myClient = new TcpClient();
try
{
myClient.Connect("127.0.0.1", 80)
}
catch (Exception ex) {MessangeBox.Show(ex.ToString()); }
myClient.Close()
} //End for
Everything go fine, thousands of connections are opened and closed until
this error appear....

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

After this error, I execute the netstat -a command and the lines (below)
appear thousands of times, lines below are just a very little part of the
complete list.

TCP asusis-dsgn:3505 localhost:80 TIME_WAIT
TCP asusis-dsgn:3506 localhost:80 TIME_WAIT
TCP asusis-dsgn:3507 localhost:89 TIME_WAIT
TCP asusis-dsgn:3508 localhost:89 TIME_WAIT
TCP asusis-dsgn:3509 localhost:89 TIME_WAIT
TCP asusis-dsgn:3510 localhost:89 TIME_WAIT
TCP asusis-dsgn:3511 localhost:89 TIME_WAIT
TCP asusis-dsgn:3512 localhost:89 TIME_WAIT
TCP asusis-dsgn:3513 localhost:89 TIME_WAIT
TCP asusis-dsgn:3514 localhost:89 TIME_WAIT
TCP asusis-dsgn:3515 localhost:89 TIME_WAIT
TCP asusis-dsgn:3516 localhost:89 TIME_WAIT
TCP asusis-dsgn:3517 localhost:89 TIME_WAIT
TCP asusis-dsgn:3518 localhost:89 TIME_WAIT
TCP asusis-dsgn:3519 localhost:89 TIME_WAIT
TCP asusis-dsgn:3520 localhost:89 TIME_WAIT
TCP asusis-dsgn:3521 localhost:89 TIME_WAIT
TCP asusis-dsgn:3522 localhost:89 TIME_WAIT
TCP asusis-dsgn:3523 localhost:89 TIME_WAIT
TCP asusis-dsgn:3524 localhost:89 TIME_WAIT
TCP asusis-dsgn:3525 localhost:89 TIME_WAIT
TCP asusis-dsgn:3526 localhost:89 TIME_WAIT
TCP asusis-dsgn:3527 localhost:89 TIME_WAIT

I think that for some reason the .net framework is not really closing the
socket, so it still alive with the TIME_WAIT status

And after thousands of TIME_WAIT connections, the OS reject connections.

Pleaseeeeee help to solve it!!
Thanks
Nov 15 '05 #1
9 11302
AA,

I found the following in an article about SQL server and connecting to
it:

Note that the SQL Server network library specifically does not enable the
SO_REUSEADDR TCP/IP socket option for security reasons. When SO_REUSEADDR is
enabled, a malicious user can hijack a client port to SQL Server and use the
credentials that the client supplies to gain access to the computer that is
running SQL Server. By default, because the SQL Server network library does
not enable the SO_REUSEADDR socket option, every time you open and close a
socket through the SQL Server network library on the client side, the socket
enters a TIME_WAIT state for four minutes. If you are rapidly opening and
closing SQL Server connections over TCP/IP with pooling disabled, you are
rapidly opening and closing TCP/IP sockets. In other words, each SQL Server
connection has one TCP/IP socket. If you rapidly open and close 4000 sockets
in less than four minutes, you will reach the default maximum setting for
client anonymous ports, and new socket connection attempts fail until the
existing set of TIME_WAIT sockets times out.

While you are not using SQL server, it is the same problem you are
having. What you can do is set the following value in the registry:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servic es\Tcpip\Parameters\TcpTim
edWaitDelay

You can set the value to the number of seconds to wait before the socket
is usable again.

However, setting this can have detrimental effects. Is there a need to
open a few thousand client connections? Can it be done a different, and
more efficient way? Setting the above value is dangerous because it is
machine-wide.

Hope this helps.
--
- Nicholas Paldino [.NET/C# MVP]
- nick(dot)paldino=at=exisconsulting<dot>com

"AA" <aa@personal.net.py> wrote in message
news:OU**************@TK2MSFTNGP11.phx.gbl...
This is making me crazy!!

Please, if some body can help me.

I'm testing a ver simple socket client.
In my test I just open and close a connection (in a loop) to my local IIS
server (port 80)

using System.Net.Sockets;

for (int I = 0; I < 5000; I++)
{
TcpClient myClient = new TcpClient();
try
{
myClient.Connect("127.0.0.1", 80)
}
catch (Exception ex) {MessangeBox.Show(ex.ToString()); }
myClient.Close()
} //End for
Everything go fine, thousands of connections are opened and closed until
this error appear....

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

After this error, I execute the netstat -a command and the lines (below)
appear thousands of times, lines below are just a very little part of the
complete list.

TCP asusis-dsgn:3505 localhost:80 TIME_WAIT
TCP asusis-dsgn:3506 localhost:80 TIME_WAIT
TCP asusis-dsgn:3507 localhost:89 TIME_WAIT
TCP asusis-dsgn:3508 localhost:89 TIME_WAIT
TCP asusis-dsgn:3509 localhost:89 TIME_WAIT
TCP asusis-dsgn:3510 localhost:89 TIME_WAIT
TCP asusis-dsgn:3511 localhost:89 TIME_WAIT
TCP asusis-dsgn:3512 localhost:89 TIME_WAIT
TCP asusis-dsgn:3513 localhost:89 TIME_WAIT
TCP asusis-dsgn:3514 localhost:89 TIME_WAIT
TCP asusis-dsgn:3515 localhost:89 TIME_WAIT
TCP asusis-dsgn:3516 localhost:89 TIME_WAIT
TCP asusis-dsgn:3517 localhost:89 TIME_WAIT
TCP asusis-dsgn:3518 localhost:89 TIME_WAIT
TCP asusis-dsgn:3519 localhost:89 TIME_WAIT
TCP asusis-dsgn:3520 localhost:89 TIME_WAIT
TCP asusis-dsgn:3521 localhost:89 TIME_WAIT
TCP asusis-dsgn:3522 localhost:89 TIME_WAIT
TCP asusis-dsgn:3523 localhost:89 TIME_WAIT
TCP asusis-dsgn:3524 localhost:89 TIME_WAIT
TCP asusis-dsgn:3525 localhost:89 TIME_WAIT
TCP asusis-dsgn:3526 localhost:89 TIME_WAIT
TCP asusis-dsgn:3527 localhost:89 TIME_WAIT

I think that for some reason the .net framework is not really closing the
socket, so it still alive with the TIME_WAIT status

And after thousands of TIME_WAIT connections, the OS reject connections.

Pleaseeeeee help to solve it!!
Thanks

Nov 15 '05 #2
AA
Excellent.

Thank you very much Nicholas, this is the explain that I was searched for
long time.

AA
"Nicholas Paldino [.NET/C# MVP]" <ni**************@exisconsulting.com> wrote
in message news:%2****************@TK2MSFTNGP11.phx.gbl...
AA,

I found the following in an article about SQL server and connecting to
it:

Note that the SQL Server network library specifically does not enable the
SO_REUSEADDR TCP/IP socket option for security reasons. When SO_REUSEADDR is enabled, a malicious user can hijack a client port to SQL Server and use the credentials that the client supplies to gain access to the computer that is running SQL Server. By default, because the SQL Server network library does not enable the SO_REUSEADDR socket option, every time you open and close a
socket through the SQL Server network library on the client side, the socket enters a TIME_WAIT state for four minutes. If you are rapidly opening and
closing SQL Server connections over TCP/IP with pooling disabled, you are
rapidly opening and closing TCP/IP sockets. In other words, each SQL Server connection has one TCP/IP socket. If you rapidly open and close 4000 sockets in less than four minutes, you will reach the default maximum setting for
client anonymous ports, and new socket connection attempts fail until the
existing set of TIME_WAIT sockets times out.

While you are not using SQL server, it is the same problem you are
having. What you can do is set the following value in the registry:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servic es\Tcpip\Parameters\TcpTim edWaitDelay

You can set the value to the number of seconds to wait before the socket is usable again.

However, setting this can have detrimental effects. Is there a need to open a few thousand client connections? Can it be done a different, and
more efficient way? Setting the above value is dangerous because it is
machine-wide.

Hope this helps.
--
- Nicholas Paldino [.NET/C# MVP]
- nick(dot)paldino=at=exisconsulting<dot>com

"AA" <aa@personal.net.py> wrote in message
news:OU**************@TK2MSFTNGP11.phx.gbl...
This is making me crazy!!

Please, if some body can help me.

I'm testing a ver simple socket client.
In my test I just open and close a connection (in a loop) to my local IIS server (port 80)

using System.Net.Sockets;

for (int I = 0; I < 5000; I++)
{
TcpClient myClient = new TcpClient();
try
{
myClient.Connect("127.0.0.1", 80)
}
catch (Exception ex) {MessangeBox.Show(ex.ToString()); }
myClient.Close()
} //End for
Everything go fine, thousands of connections are opened and closed until
this error appear....

[ System.Net.Sockets.SocketException: Only one usage of each socket

address
(protocol/network address/port) is normally permitted ]

After this error, I execute the netstat -a command and the lines (below)
appear thousands of times, lines below are just a very little part of the complete list.

TCP asusis-dsgn:3505 localhost:80 TIME_WAIT
TCP asusis-dsgn:3506 localhost:80 TIME_WAIT
TCP asusis-dsgn:3507 localhost:89 TIME_WAIT
TCP asusis-dsgn:3508 localhost:89 TIME_WAIT
TCP asusis-dsgn:3509 localhost:89 TIME_WAIT
TCP asusis-dsgn:3510 localhost:89 TIME_WAIT
TCP asusis-dsgn:3511 localhost:89 TIME_WAIT
TCP asusis-dsgn:3512 localhost:89 TIME_WAIT
TCP asusis-dsgn:3513 localhost:89 TIME_WAIT
TCP asusis-dsgn:3514 localhost:89 TIME_WAIT
TCP asusis-dsgn:3515 localhost:89 TIME_WAIT
TCP asusis-dsgn:3516 localhost:89 TIME_WAIT
TCP asusis-dsgn:3517 localhost:89 TIME_WAIT
TCP asusis-dsgn:3518 localhost:89 TIME_WAIT
TCP asusis-dsgn:3519 localhost:89 TIME_WAIT
TCP asusis-dsgn:3520 localhost:89 TIME_WAIT
TCP asusis-dsgn:3521 localhost:89 TIME_WAIT
TCP asusis-dsgn:3522 localhost:89 TIME_WAIT
TCP asusis-dsgn:3523 localhost:89 TIME_WAIT
TCP asusis-dsgn:3524 localhost:89 TIME_WAIT
TCP asusis-dsgn:3525 localhost:89 TIME_WAIT
TCP asusis-dsgn:3526 localhost:89 TIME_WAIT
TCP asusis-dsgn:3527 localhost:89 TIME_WAIT

I think that for some reason the .net framework is not really closing the socket, so it still alive with the TIME_WAIT status

And after thousands of TIME_WAIT connections, the OS reject connections.
Pleaseeeeee help to solve it!!
Thanks


Nov 15 '05 #3
AA
Another question.. Is possible that, programatically (in .NET) to set this
property? Not for all applications, for a specific application that I want?

Because, When I use the Microsoft Application Center Test, I look that he
open and close thousands of connection, but when i execute the netstat I saw
just 1 record

It will be excellent for me

Thanks a lot

AA
"Nicholas Paldino [.NET/C# MVP]" <ni**************@exisconsulting.com> wrote
in message news:%2****************@TK2MSFTNGP11.phx.gbl...
AA,

I found the following in an article about SQL server and connecting to
it:

Note that the SQL Server network library specifically does not enable the
SO_REUSEADDR TCP/IP socket option for security reasons. When SO_REUSEADDR is enabled, a malicious user can hijack a client port to SQL Server and use the credentials that the client supplies to gain access to the computer that is running SQL Server. By default, because the SQL Server network library does not enable the SO_REUSEADDR socket option, every time you open and close a
socket through the SQL Server network library on the client side, the socket enters a TIME_WAIT state for four minutes. If you are rapidly opening and
closing SQL Server connections over TCP/IP with pooling disabled, you are
rapidly opening and closing TCP/IP sockets. In other words, each SQL Server connection has one TCP/IP socket. If you rapidly open and close 4000 sockets in less than four minutes, you will reach the default maximum setting for
client anonymous ports, and new socket connection attempts fail until the
existing set of TIME_WAIT sockets times out.

While you are not using SQL server, it is the same problem you are
having. What you can do is set the following value in the registry:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servic es\Tcpip\Parameters\TcpTim edWaitDelay

You can set the value to the number of seconds to wait before the socket is usable again.

However, setting this can have detrimental effects. Is there a need to open a few thousand client connections? Can it be done a different, and
more efficient way? Setting the above value is dangerous because it is
machine-wide.

Hope this helps.
--
- Nicholas Paldino [.NET/C# MVP]
- nick(dot)paldino=at=exisconsulting<dot>com

"AA" <aa@personal.net.py> wrote in message
news:OU**************@TK2MSFTNGP11.phx.gbl...
This is making me crazy!!

Please, if some body can help me.

I'm testing a ver simple socket client.
In my test I just open and close a connection (in a loop) to my local IIS server (port 80)

using System.Net.Sockets;

for (int I = 0; I < 5000; I++)
{
TcpClient myClient = new TcpClient();
try
{
myClient.Connect("127.0.0.1", 80)
}
catch (Exception ex) {MessangeBox.Show(ex.ToString()); }
myClient.Close()
} //End for
Everything go fine, thousands of connections are opened and closed until
this error appear....

[ System.Net.Sockets.SocketException: Only one usage of each socket

address
(protocol/network address/port) is normally permitted ]

After this error, I execute the netstat -a command and the lines (below)
appear thousands of times, lines below are just a very little part of the complete list.

TCP asusis-dsgn:3505 localhost:80 TIME_WAIT
TCP asusis-dsgn:3506 localhost:80 TIME_WAIT
TCP asusis-dsgn:3507 localhost:89 TIME_WAIT
TCP asusis-dsgn:3508 localhost:89 TIME_WAIT
TCP asusis-dsgn:3509 localhost:89 TIME_WAIT
TCP asusis-dsgn:3510 localhost:89 TIME_WAIT
TCP asusis-dsgn:3511 localhost:89 TIME_WAIT
TCP asusis-dsgn:3512 localhost:89 TIME_WAIT
TCP asusis-dsgn:3513 localhost:89 TIME_WAIT
TCP asusis-dsgn:3514 localhost:89 TIME_WAIT
TCP asusis-dsgn:3515 localhost:89 TIME_WAIT
TCP asusis-dsgn:3516 localhost:89 TIME_WAIT
TCP asusis-dsgn:3517 localhost:89 TIME_WAIT
TCP asusis-dsgn:3518 localhost:89 TIME_WAIT
TCP asusis-dsgn:3519 localhost:89 TIME_WAIT
TCP asusis-dsgn:3520 localhost:89 TIME_WAIT
TCP asusis-dsgn:3521 localhost:89 TIME_WAIT
TCP asusis-dsgn:3522 localhost:89 TIME_WAIT
TCP asusis-dsgn:3523 localhost:89 TIME_WAIT
TCP asusis-dsgn:3524 localhost:89 TIME_WAIT
TCP asusis-dsgn:3525 localhost:89 TIME_WAIT
TCP asusis-dsgn:3526 localhost:89 TIME_WAIT
TCP asusis-dsgn:3527 localhost:89 TIME_WAIT

I think that for some reason the .net framework is not really closing the socket, so it still alive with the TIME_WAIT status

And after thousands of TIME_WAIT connections, the OS reject connections.
Pleaseeeeee help to solve it!!
Thanks


Nov 15 '05 #4
[snap]
While you are not using SQL server, it is the same problem you are
having. What you can do is set the following value in the registry:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servic es\Tcpip\Parameters\TcpTim edWaitDelay
You can set the value to the number of seconds to wait before the socket is usable again.


With respect for the workaround, this is the typical kind of quick fix I
think often introduces perhaps more misery than it fixes. It's kind of hard
to swallow it is NOT possible to close the connection from the calling
class. Regardless of whether it's a best practice approach, isn't at least
STRANGE the connection can not be closed by the process initiating it ?

Don't get me wrong, I am not arguing your probably perfectlly valid
solution, I just think it is a bit typical of how Windows programs are often
quite unstable and/or disrupt other programs' execution. The term
end-of-pipe-solution comes to mind...

Best!,
Stu
Nov 15 '05 #5
"AA" <aa@personal.net.py> wrote in message
news:OU**************@TK2MSFTNGP11.phx.gbl...
I'm testing a ver simple socket client.
In my test I just open and close a connection (in a loop) to my local IIS
server (port 80)

using System.Net.Sockets;

for (int I = 0; I < 5000; I++)
{
TcpClient myClient = new TcpClient();
try
{
myClient.Connect("127.0.0.1", 80)
}
catch (Exception ex) {MessangeBox.Show(ex.ToString()); }
myClient.Close()
} //End for
Everything go fine, thousands of connections are opened and closed until
this error appear....

[ System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted ] I think that for some reason the .net framework is not really closing the
socket, so it still alive with the TIME_WAIT status

And after thousands of TIME_WAIT connections, the OS reject connections.

I think your problem is that you should also be closing the underlying
stream:

for (int i = 0; i < 5000; i++) {
TcpClient myClient = new TcpClient();
try {
myClient.Connect("127.0.0.1", 80)
} catch (Exception ex) {
MessageBox.Show(ex.ToString());
} finally {

if (myClient.GetStream() != null) myClient.GetStream().Close(); //
Does a Dispose().
myClient.Close(); // Does a Dispose().
}
}
-- Alan
Nov 15 '05 #6
Alan Pretre <no@spam> wrote:
I think your problem is that you should also be closing the underlying
stream:


<snip>

I don't think so. From the docs for TcpClient.Close():

<quote>
The Close method closes the TCP connection. It calls the Dispose method
passing a true value to release all managed and unmanaged resources
associated with the TcpClient. These resources include the underlying
Socket used for connecting with the remote host, and the NetworkStream
used to send and receive data.
</quote>

I think it's actually perfectly natural - when a connection is closed,
it *does* go into TIME_WAIT. I think everything's behaving fine here,
although I'll admit to not understanding the real details of TCP/IP as
well as I'd like. See
http://www.developerweb.net/sock-faq/detail.php?id=13
for more details.

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet
If replying to the group, please do not mail me too
Nov 15 '05 #7
"Jon Skeet [C# MVP]" <sk***@pobox.com> wrote in message
news:MP************************@msnews.microsoft.c om...
Alan Pretre <no@spam> wrote:
I think your problem is that you should also be closing the underlying
stream:


I don't think so. From the docs for TcpClient.Close():

<quote>
The Close method closes the TCP connection. It calls the Dispose method
passing a true value to release all managed and unmanaged resources
associated with the TcpClient. These resources include the underlying
Socket used for connecting with the remote host, and the NetworkStream
used to send and receive data.
</quote>


I've seen this firsthand in my own code. You would like to think that
myClient.Close() is sufficient but it isn't. I don't know why. Perhaps
this is a bug?

See also, for example:
http://groups.google.com/groups?hl=e...gbl%26rnum%3D3

-- Alan
Nov 15 '05 #8
Alan Pretre <no@spam> wrote:
I've seen this firsthand in my own code. You would like to think that
myClient.Close() is sufficient but it isn't. I don't know why. Perhaps
this is a bug?


It certainly sounds like it. I wonder whether it closes the stream *if*
you've fetched it, but doesn't do everything necessary if you haven't
used the stream at all...

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet
If replying to the group, please do not mail me too
Nov 15 '05 #9
In article <u9**************@TK2MSFTNGP10.phx.gbl>, Alan Pretre wrote:
You would like to think that
myClient.Close() is sufficient but it isn't. I don't know why.


TIME_WAIT is there to ensure that any late arriving packets have
arrived before closing the connection. It's necessary as the next
application using that local port should be perturbed if it receives a
late packet from the previous connection.

http://tangentsoft.net/wskfaq/articl...gging-tcp.html is a nice
summary.

Mike

Nov 15 '05 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: Joe | last post by:
Hi, I browsed the news and a few seem to have this problem too, but no solution ! I have a client server application where in case the connection gets bad (crashes or whatever) client or...
4
by: Nuno Magalhaes | last post by:
How can I close another socket belonging to the same application but all know is the IP address of the client and the port number that the server is listening on. Sounds like a firewall I know...
7
by: | last post by:
Hi all, I have a simple .aspx page running on net 2.0 that is trying to do a http post to a remote server. Here is the code Private Function ProcessRequests(ByVal strbody As String) As String...
13
by: coloradowebdev | last post by:
i am working on basically a proxy server that handles requests via remoting from clients and executes transactions against a third-party server via TCP. the remoting site works like a champ. my...
9
by: Macca | last post by:
Hi, I have a synchronous socket server which my app uses to read data from clients. To test this I have a simulated client that sends 100 byte packets. I have set up the socket server so...
6
by: Sharon | last post by:
Hi all. I'm trying first time async socket connection. In all the examples i've seen, the server connection is closed when the message is complete. Is it common to close the connection after...
6
by: Sean | last post by:
Hi Everyone, My apologies for a somewhat dump question but I am really stuck. I have been working on this code for two days straight I am dont know what is wrong with it. when I run the code, All...
11
by: atlaste | last post by:
Hi, In an attempt to create a full-blown webcrawler I've found myself writing a wrapper around the Socket class in an attempt to make it completely async, supporting timeouts and some scheduling...
8
by: =?Utf-8?B?Sm9obg==?= | last post by:
Hi all, I am new to .net technologies. ASP.NET supports socket programming like send/receive in c or c++? I am developing web-site application in asp.net and code behind is Visual C#. In...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.