Metoda TcpClient Zavřít zavřete podkladové připojení TCP

Překlady článku Překlady článku
ID článku: 821625 - Produkty, které se vztahují k tomuto článku.
Tento článek se týká následující Microsoft .NET Framework knihovny tříd obory názvů:
  • System.Net
  • System.Net.Sockets
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Při volání metody TcpClient zavřít očekáváte podkladové připojení TCP uzavřen, jak je popsáno v tématu "TcpClient.Close metoda" knihovny tříd .NET Framework dokumentaci. Další informace naleznete na následujícím webu společnosti Microsoft:
http://msdn2.microsoft.com/en-us/library/system.net.sockets.tcpclient.close(vs.71).aspx

Řešení

Chcete-li tento problém vyřešit, zavřete přidružený objekt NetworkStream, vrátí metoda TcpClient GetStream.

Další informace

Postup reprodukce problému

  1. V textovém editoru, jako je například Poznámkový blok vložte následující ukázkový kód.
    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    
    class Server
    {
    	static void Main(string[] args)
    	{
    		try
    		{
    			const int portNumber = 10000;
    			TcpListener tcpListener = new TcpListener(IPAddress.Loopback, portNumber);
    
    			tcpListener.Start();
    
    			Console.WriteLine("Waiting for a connection....");
    
    			//Accept the pending client connection, and then return a TcpClient that is initialized for communication.
    			TcpClient tcpClient = tcpListener.AcceptTcpClient();
    			Console.WriteLine("Connection accepted.");
    
    			NetworkStream networkStream = tcpClient.GetStream();
    
    			string responseString = "You have successfully connected to me\n";
    
    			Byte[] sendBytes = Encoding.ASCII.GetBytes(responseString.ToCharArray());
    			networkStream.Write(sendBytes, 0, sendBytes.Length);
    
    			Console.Write("Message Sent /> : " + responseString);
    
    			//Close networkStream and TcpClient.
    			//networkStream.Close();
    			tcpClient.Close();
    
    			//Wait until you can see that the connection is closed in the client.
    			Console.ReadLine();
                                
    			//Close the listener.
    			tcpListener.Stop();
    
    		}
    		catch (Exception e) 
    		{
    			Console.WriteLine(e.ToString());
    		}   
    	}
    }
  2. Uložte soubor jako Server.cs.
  3. Klepněte na tlačítko Start, přejděte na příkaz programy, přejděte na příkaz Microsoft Visual Studio.NET (pro Microsoft Visual Studio .NET 2002) nebo Microsoft Visual Studio .NET 2003, přejděte na příkaz Nástroje Visual Studio .NET a klepněte na položku Visual Studio .NET příkazový nebo Visual Studio .NET 2003 MS-DOS.
  4. Na příkazovém řádku zadejte následující příkaz a stiskněte klávesu ENTER kompilovat Server.cs:
    CSC server.cs
  5. Na příkazovém řádku zadejte následující příkaz a stiskněte klávesu ENTER:
    spustit server.exe
  6. Na příkazovém řádku zadejte následující příkaz a stiskněte klávesu ENTER:
    netstat -p tcp - a
    Všimněte si, že je otevřeno připojení TCP na portu 10000 a připojení je ve stavu LISTENING.
  7. V textovém editoru, jako je například Poznámkový blok, vložte následující ukázkový kód.
    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    
    class Client
    {
    	static void Main(string[] args)
    	{
    		try
    		{
    			TcpClient tcpClient = new TcpClient();
    		
    			tcpClient.Connect(IPAddress.Loopback, 10000);
    			NetworkStream networkStream = tcpClient.GetStream();
    
    			if(networkStream.CanWrite && networkStream.CanRead)
    			{
    				// Reads the NetworkStream to a byte buffer.
    				byte[] bytes = new byte[38];
    				networkStream.Read(bytes, 0, bytes.Length);
    				
    				// Returns to the console the data that is received from the host.
    				string returndata = Encoding.ASCII.GetString(bytes);
    				Console.Write("This is what the host returned to you: " + returndata.TrimEnd(new char[] {' '}));
    				Console.ReadLine();
    				networkStream.Close();
    				tcpClient.Close();
    			}
    		}
    		catch (Exception e ) 
    		{
    			Console.WriteLine(e.ToString());
    		}
    	}
    }
  8. Uložte soubor jako Client.cs.
  9. Na příkazovém řádku zadejte následující příkaz a stiskněte klávesu ENTER sestavení Client.cs:
    CSC client.cs
  10. Na příkazovém řádku zadejte následující příkaz a stiskněte klávesu ENTER:
    Spustit client.exe
  11. Na příkazovém řádku zadejte následující příkaz a stiskněte klávesu ENTER:
    netstat -p tcp - a
    Všimněte si, že je otevřeno připojení TCP a je ve stavu ESTABLISHED připojení.

    Protože uzavřen připojení na straně serveru připojení soketu straně serveru by měl být ve stavu FIN_WAIT_2 a klientské straně soket připojení by měla být ve stavu CLOSE_WAIT. Toto chování je popsána v dokumentu RFC 793 - "Transmission Control Protocol Darpa Internet Program Protocol Specification."
  12. Kód v kroku 1 změnit podle uncommenting následující řádek:
    //networkStream.Close();
    opakovat kroky 3 až 9.

    Všimněte si, že je připojení soketu straně serveru ve stavu FIN_WAIT_2 a klientské straně soket připojení je ve stavu CLOSE_WAIT. K tomuto chování dochází, protože připojení je ukončeno na straně serveru.

Odkazy

Další informace o třídě TcpClient naleznete na následujícím webu:
http://msdn2.microsoft.com/en-us/library/system.net.sockets.tcpclient(vs.71).aspx

Vlastnosti

ID článku: 821625 - Poslední aktualizace: 17. května 2007 - Revize: 2.4
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Klíčová slova: 
kbmt kbclientserver kbapi kbprogramming kbprb KB821625 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:821625

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com