When the server shuts down, does it call Socket.Shutdown or set the
LingerTime property, or do you just use Close()?  Close does not
necessarily immediately close the socket; it may hang around for a
while afterwards, which would lead to the message successfully being
delivered.


On Mon, 3 Jan 2005 15:44:52 -0500, Eddie Lascu <[EMAIL PROTECTED]> wrote:
> In my class I had it turned off. I turned it off in this example too, but I
> would not make a difference. I just added these lines:
> 
> // disable the Nagle algorithm
> sender.SetSocketOption( SocketOptionLevel.Socket, SocketOptionName.NoDelay,
> 1 );
> 
> right after the connect.
> Overall, it bothers me because TCP guarantees you to deliver every message
> and here the second message is lost without a trace.
> 
> Cheers,
> Eddie
> 
> 
> -----Original Message-----
> From: Unmoderated discussion of advanced .NET topics.
> [mailto:[EMAIL PROTECTED] Behalf Of Jim Sievert
> Sent: Monday, January 03, 2005 3:21 PM
> To: [email protected]
> Subject: Re: [ADVANCED-DOTNET] Tcp/Ip Client successfully sends a
> message even after the Server has closed its socket
> 
> Turn off Nagle (SocketOptionName.NoDelay) on the client and see what
> happens.
> 
> > -----Original Message-----
> > From: Unmoderated discussion of advanced .NET topics.
> > [mailto:[EMAIL PROTECTED] On Behalf Of Eddie Lascu
> > Sent: Monday, January 03, 2005 1:51 PM
> > To: [email protected]
> > Subject: [ADVANCED-DOTNET] Tcp/Ip Client successfully sends a
> > message even after the Server has closed its socket
> >
> > Hello everybody and a Happy New Year 2005!
> >
> > Over the Holiday vacation I created a bunch of test cases for
> > some classes that I wrote for Tcp/Ip network programming and
> > I found a strange behavior.
> > If I have a client and a server exchanging messages and if
> > the server decides to go down for whatever reasons, the
> > client can still send successfully one message before
> > throwing an exception that tells me the communication channel
> > is no longer valid. I thought there was something wrong in my
> > classes but I adapted the two samples from MSDN (Synchronous
> > Server Socket Example and Synchronous Client Socket Example)
> > to recreate this behavior.
> > The Server end accepts the connection from the client and
> > then receives just one message. After that it shuts down and
> > closes the socket.
> > The Client connects to the server and then tries to send
> > three messages.
> > First one is successfully sent and received. The second one
> > is successfully sent, but obviously not received since the
> > server closed its socket. The third one fails to be sent and
> > the client throws and exception.
> > Evidently, my question is why the second message is
> > successfully sent since the server socket was closed. In the
> > documentation, the Socket.Close method is said to "close the
> > remote host connection and release all managed and unmanaged
> > resources associated with the Socket".
> > I did networking programming in the old VC6.0 days and I
> > don't remember this being a consistent behavior. I guess it
> > must have to do with the managed resources that are not
> > garbage-collected very fast, or something.
> > Did anybody else encountered this thing?
> >
> > Here is the code for the two ends. If you want to test it,
> > create two C# console apps and dump the code below in the
> > Class1.cs file for each project.
> > Any hint will be highly appreciated.
> >
> > Best regards,
> > Eddie
> >
> > ////////////////////
> > //                //
> > // On Server side //
> > //                //
> > ////////////////////
> >
> > using System;
> > using System.Net;
> > using System.Net.Sockets;
> > using System.Text;
> >
> > public class SynchronousSocketListener
> > {
> >    public static void StartListening()
> >    {
> >       // Data buffer for incoming data.
> >       byte[] bytes = new Byte[1024];
> >
> >       // Establish the local endpoint for the socket.
> >       // Dns.GetHostName returns the name of the
> >       // host running the application.
> >       IPHostEntry ipHostInfo = Dns.Resolve( Dns.GetHostName() );
> >       IPAddress ipAddress = ipHostInfo.AddressList[0];
> >       IPEndPoint localEndPoint = new IPEndPoint( ipAddress, 11000 );
> >
> >       // Create a TCP/IP socket.
> >       Socket listener = new Socket( AddressFamily.InterNetwork,
> >                                     SocketType.Stream,
> >                                     ProtocolType.Tcp );
> >
> >       // Bind the socket to the local endpoint and
> >       // listen for incoming connections.
> >       try
> >       {
> >          listener.Bind(localEndPoint);
> >          listener.Listen(1);
> >
> >          // Start listening for connections.
> >          Console.WriteLine("Waiting for a connection...");
> >          // Program is suspended while waiting for an
> > incoming connection.
> >          Socket handler = listener.Accept();
> >          string data = null;
> >
> >          // An incoming connection needs to be processed.
> >          bytes = new byte[1024];
> >          int bytesRec = handler.Receive(bytes);
> >          data += Encoding.ASCII.GetString(bytes,0,bytesRec);
> >
> >          // Show the data on the console.
> >          Console.WriteLine( "Text received : {0}", data);
> >
> >
> >          Console.WriteLine( "Shutting down the socket..." );
> >          handler.Shutdown(SocketShutdown.Both);
> >          handler.Close();
> >          Console.WriteLine( "The socket was closed!" );
> >       }
> >       catch (Exception e)
> >       {
> >          Console.WriteLine(e.ToString());
> >       }
> >    }
> >
> >    public static int Main(String[] args)
> >    {
> >       StartListening();
> >       Console.WriteLine( "Press <Enter> to Exit..." );
> >       Console.ReadLine();
> >       return 0;
> >    }
> > }
> >
> > ////////////////////
> > //                //
> > // On Client side //
> > //                //
> > ////////////////////
> >
> > using System;
> > using System.Net;
> > using System.Net.Sockets;
> > using System.Text;
> >
> > public class SynchronousSocketClient
> > {
> >
> >    public static void StartClient()
> >    {
> >       // Data buffer for incoming data.
> >       byte[] bytes = new byte[1024];
> >
> >       // Connect to a remote device.
> >       try
> >       {
> >          // Establish the remote endpoint for the socket.
> >          IPAddress ipAddress = IPAddress.Parse(
> > "10.120.5.107" );       // my IP
> > address
> >          IPEndPoint remoteEP = new IPEndPoint( ipAddress, 11000 );
> >
> >          // Create a TCP/IP  socket.
> >          Socket sender = new Socket( AddressFamily.InterNetwork,
> >                                      SocketType.Stream,
> >                                      ProtocolType.Tcp );
> >
> >          // Connect the socket to the remote endpoint. Catch
> > any errors.
> >          try
> >          {
> >             sender.Connect(remoteEP);
> >
> >             Console.WriteLine( "Socket connected to {0}",
> >                                sender.RemoteEndPoint.ToString() );
> >
> >             for( int i=1; i<4; i++ )
> >             {
> >                string message = "This is message ";
> >                message += i.ToString();
> >
> >                // Encode the data string into a byte array.
> >                byte[] msg = Encoding.ASCII.GetBytes(message);
> >
> >                // Send the data through the socket.
> >                int bytesSent = sender.Send(msg);
> >
> >                // Show the data on the console.
> >                Console.WriteLine( "Text sent: {0}", message );
> >
> >                // break for 5 seconds
> >                Console.WriteLine( "Sleep five seconds!" );
> >                System.Threading.Thread.Sleep( 5000 );
> >             }
> >
> >             // Release the socket.
> >             sender.Shutdown(SocketShutdown.Both);
> >             sender.Close();
> >
> >          }
> >          catch (ArgumentNullException ane)
> >          {
> >             Console.WriteLine("ArgumentNullException :
> > {0}",ane.ToString());
> >          }
> >          catch (SocketException se)
> >          {
> >             Console.WriteLine("SocketException : {0}",se.ToString());
> >          }
> >          catch (Exception e)
> >          {
> >             Console.WriteLine("Unexpected exception : {0}",
> > e.ToString());
> >          }
> >
> >       }
> >       catch (Exception e)
> >       {
> >          Console.WriteLine( e.ToString());
> >       }
> >    }
> >
> >    public static int Main(String[] args)
> >    {
> >       StartClient();
> >       Console.WriteLine( "Press <Enter> to Exit..." );
> >       Console.ReadLine();
> >       return 0;
> >    }
> > }
> >
> > ===================================
> > This list is hosted by DevelopMentorR  http://www.develop.com
> >
> > View archives and manage your subscription(s) at
> > http://discuss.develop.com
> >
> 
> ===================================
> This list is hosted by DevelopMentor.  http://www.develop.com
> 
> View archives and manage your subscription(s) at http://discuss.develop.com
> 
> ===================================
> This list is hosted by DevelopMentor�  http://www.develop.com
> 
> View archives and manage your subscription(s) at http://discuss.develop.com
> 


-- 
Eric Means
[EMAIL PROTECTED]
http://www.randomtree.org/eric/

===================================
This list is hosted by DevelopMentor�  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to