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

Tento článek se týká následujících oborů názvů knihovny tříd rozhraní.NET Framework společnosti Microsoft:
  • System.Net
  • System.Net.Sockets

Příznaky

Při volání metody TcpClient Close , očekáváte, že podkladové připojení TCP uzavřeno, jak je popsáno v tématu "TcpClient.Close metoda" dokumentace rozhraní.NET Framework Class Library. Další informace naleznete na následujícím webu společnosti Microsoft:

Řešení

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

Další informace

Kroky pro reprodukci problému

  1. V textovém editoru, například programu 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
    Programy, přejděte na Microsoft Visual Studio.NET (pro Microsoft Visual Studio .NET 2002) nebo Microsoft Visual Studio .NET 2003, přejděte na příkaz Nástroje aplikace Visual Studio .NETa pak klepněte na tlačítko
    Příkazový řádek sady Visual Studio .NET nebo Visual Studio .NET 2003 příkazový řádek.
  4. Na příkazovém řádku zadejte následující příkaz a stiskněte klávesu ENTER pro kompilaci Server.cs:
    CSC server.cs.
  5. Na příkazovém řádku zadejte následující příkaz a stiskněte klávesu ENTER:
    Spusťte 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 POSLECH .
  7. V textovém editoru, například programu 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 pro vytvoření Client.cs:
    CSC client.cs
  10. Na příkazovém řádku zadejte následující příkaz a stiskněte klávesu ENTER:
    Spusťte 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 že připojení je ve stavu ESTABLISHED .

    Protože uzavřen připojení na straně serveru by měla být připojení soketu straně serveru ve stavu FIN_WAIT_2 a klientské připojení soketu straně by měla být ve stavu CLOSE_WAIT . Toto chování je popsána v dokumentu RFC 793 - "Přenos ovládací prvek protokolu Darpa Internet Program specifikace protokolu."
  12. Změníte kód v kroku 1 uncommenting následující řádek:
    //networkStream.Close();
    Opakujte kroky 3 až 9.

    Všimněte si, že je připojení soketu straně serveru ve stavu FIN_WAIT_2 a klientské připojení soketu straně 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 společnosti Microsoft:Chyba č: 3858 (Údržba obsahu)Chyba #: 144149 (aplikace Server univerzální RunTime)
Vlastnosti

ID článku: 821625 - Poslední kontrola: 16. 1. 2017 - Revize: 1

Váš názor