Laden...

Socket bleibt trotz Close vorerst geöffnet

Erstellt von Mao vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.808 Views
M
Mao Themenstarter:in
14 Beiträge seit 2008
vor 15 Jahren
Socket bleibt trotz Close vorerst geöffnet

Hallo zusammen! 😃

Ich schreib gerade an einer kleinen Server-App und beim Testen fiel mir auf, dass Sockets scheinbar - warum auch immer - trotz Close noch eine Weile geöffnet bleiben.
Der Server ist zum einen Teil erstmal der Listener, der auf ankommende Verbindungen wartet, diesen einen neuen Socket verpasst und letztlich die Verarbeitung anstößt. Dazu wird eine neue Server-Instanz erstellt und ihr das Client-Socket übergeben. Den finalen Startschuss gibt dann der Threadpool.
Im Server-Objekt selbst wird abgefragt, was der Client will, entsprechend reagiert, und dann der Socket eigentlich mit einem Shutdown, Disconnect und anschließendem Close geschlossen.
Zum Testen verwende ich den einfachen Telnet-Client, den mir Windows bietet. Der Server-Part funktioniert soweit eigtl, die Verbindung wird auch geschlossen (Telnet schmeißt mich mit dem typischen "Verbindung zu Host verloren." raus) - wie gesagt bloß das Problem, dass der Client-Socket auf Server-Seite scheinbar geöffnet bleibt. Ein "netstat -a" ergibt mir zumindest, dass mein Server noch einen Socket zum Client offen hat (Status: wartend), der Client seinen korrekterweise aber bereits geschlossen hat.

Konkrete Frage: Was könnte daran schuld sein, dass der Socket auf Server-Seite geöffnet bleibt? (Lässt sich da ohne Code evtl. etwas zu sagen?)

Viele Grüße!
Mao

M
Mao Themenstarter:in
14 Beiträge seit 2008
vor 15 Jahren

Hi!

Ich habe gerade eben mal ein wenig Code verfasst, der das Problem aufzeigt.
Vielleicht fällt jemandem ja etwas auf?


 class Program
    {
        static void Main(string[] args)
        {
            Listener listener = new Listener();
            Thread listenerThread = new Thread(new ThreadStart(listener.Listen));
            listenerThread.Start();

            Console.WriteLine("Zum Beenden Taste drücken...");
            Console.ReadKey(true);
        }

        class Listener
        {
            TcpListener listener;
            
            internal Listener()
            {
                listener=new TcpListener(IPAddress.Any, 1000);
            }

            internal void Listen()
            {
                listener.Start();

                while (true)
                {
                    Socket client=listener.AcceptSocket();
                    Server server= new Server();
                    ThreadPool.QueueUserWorkItem(server.HandleRequest,client);
                }
            }
        }

        class Server
        {
            internal void HandleRequest(Object state)
            {
                Socket client = state as Socket;
                client.Send(Encoding.UTF8.GetBytes("Hello World!"));
                client.Close();
            }
        }

    }

Lass ich den Code laufen und connecte über Telnet auf den Port (1000), dann schickt er mir zwar das "Hello World!" und die Verbindung wird laut Telnet auch geschlossen, ein "netstat -a" zeigt mir aber eine "wartende" Verbindung von Port 1000 zum Port, von dem aus Telnet zum Server verbunden war.
Hat irgendwer eine Idee?

Viele Grüße!
Mao

W
123 Beiträge seit 2008
vor 15 Jahren

Hallo Mao, probiere doch mal, vor dem "Close()" erst "Shutdown()" aufzurufen.

Gruß
wolpertinger

M
Mao Themenstarter:in
14 Beiträge seit 2008
vor 15 Jahren

Hallo!

Hm, das verändert leider nichts am Problem.
Wie ich jetzt bei weiterem Testen gemerkt hab, gibt's das Problem mit den offenen Ports nur, wenn der Server die Verbindung schließt.
Dieser Code bringts also aufs gleiche:


class Program
{
    static void Main(string[] args)
    {
        TcpListener listener = new TcpListener(IPAddress.Any, 1000)
        listener.Start();

        Socket client = listener.AcceptSocket();
        client.Send(Encoding.UTF8.GetBytes("Hello World!"));
        client.Shutdown(SocketShutdown.Both);
        client.Disconnect(false);
        client.Close();
    }
}

🤔

Viele Grüße!
Mao

W
123 Beiträge seit 2008
vor 15 Jahren

Hallo Mao,

hab's heute auch mal ausprobiert und bin zum gleichen Ergebnis gekommen. Warum's so ist, weiß ich allerdings nicht.

Gruß
wolpertinger