Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Socket.Close doesn't really close tcp socket? (c#)

It seems that using socket.Close() for a tcp socket, doesn't fully close the socket. In the following example I'm trying to connect to example.com at port 9999, which is not opened, and after a short-timeout, I'm trying to close the socket.

  for (int i = 0; i < 200; i++)
  {
    Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    sock.LingerState = new LingerOption(false, 0);
    sock.BeginConnect("www.example.com", 9999, OnSocketConnected, sock);
    System.Threading.Thread.Sleep(50);
    sock.Close();
  }

But when I take a look at netstat after the loop completes, I find that there are many half-opened sockets:

  TCP    israel-xp:6506         www.example.com:9999   SYN_SENT
  TCP    israel-xp:6507         www.example.com:9999   SYN_SENT
  TCP    israel-xp:6508         www.example.com:9999   SYN_SENT
  TCP    israel-xp:6509         www.example.com:9999   SYN_SENT

EDIT . Ok, some context was missing. I'm using beginconnect because I expect the socket connection to fail (9999 is not opened), and in my real code, I call the socket.Close() once a timer is set. On OnSocketConnected I call EndConnect, which throws an exception (trying to call a method of a disposed object). My goal is having a short timeout for the socket connection stage.

Any clue what I'm doing wrong? Thanks!

like image 526
r0u1i Avatar asked Jan 06 '10 17:01

r0u1i


1 Answers

By design, you should always call Shutdown before closing the socket.

mySocket.Shutdown(SocketShutdown.Both);
mySocket.Close();

Doing so effectively disables send and receive on the socket, so it will not be accepting incoming data after you've closed it, even if the OS still has control of it.

Jon Skeet also has a point, that since you're opening the connection asynchronously, it may actually be connecting while you're trying to close it. However, if you call Shutdown on it, it will not allow information to be received as you are experiencing.

Edit: You can only Shutdown a socket that is already connected, so bear this in mind as you write your code.

like image 128
Ed Altorfer Avatar answered Nov 15 '22 15:11

Ed Altorfer