2010-10-17 13 views
6

Was ich frage mich, ich bin diesesC# - Mehrere TCP-Verbindungen an einem Port?

client_db.clients[numberOfClients].sock = listener.Accept(); 

Für meine Vernetzung Klasse zu tun erlaubt Ich schreibe ein Chat-Client und einen Server, der sie verbindet. Ich habe ein Array von Client-Objekten, die verschiedene Informationen über jede Person enthält, die sich mit dem Server verbindet. Bevor ich mich mit einem Klienten beschäftige, hätte ich einen Sockel, der dem Hörer gleich ist. Akzeptiere, und dann würde ich all meine Sachen mit diesem Sockel machen. Ich nahm fälschlicherweise an, dass ich ein Array von Sockets verwenden könnte, um mehrere TCP-Verbindungen mit mehreren Clients zu haben.

Gibt es eine Möglichkeit, dies zu tun? Mir ist klar, dass es wahrscheinlich effizientere Möglichkeiten gibt, dies zu tun, aber ich bekomme immer noch den Überblick über die Netzwerkprogrammierung, und noch wichtiger, mein Server basiert derzeit auf der Idee, dass ich ein Socket-Array verwende. Wenn es keine Möglichkeit gibt, dies zu tun, ist dies sicherlich eine Lektion, an die ich mich erinnern werde.

EDIT: Ich hatte den Eindruck, dass dies nicht funktionierte, weil ich eine Ausnahme bekam, die etwas über "kann nicht mehrere Verbindungen haben", obwohl ich diese Ausnahme nicht wieder bekommen kann. Jetzt bekomme ich einen Objektfehler. Ich bin verwirrt, ich muss in etwas mehr suchen ..

+0

finden Sie bitte Ihren zweiten Absatz erweitern, es ist nicht klar, welche Datenstruktur und Bedienung Sie ein Problem haben. – Richard

+1

Wie sind Sie zu dem Schluss gekommen, dass ein Array von Sockets nicht funktioniert? –

+1

Es gibt viele großartige Netzwerk-Tutorials, die einen Chat-Server als eine Möglichkeit zum Erlernen von Threads implementieren. Hier ist eine: http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server Auch, wenn Sie dies für Ihre Klasse tun, sollten Sie nicht einige eigene Forschung tun? :) – bzlm

Antwort

32

Mit TCP, können Sie nur einen Prozess auf einem Port hören, aber, wenn es die Verbindung akzeptiert (wie bei Ihnen), erhalten Sie ein ganz anderes Socket-Deskriptor, um die Sitzung weiterzuführen, sodass Sie zurückgehen und den ursprünglichen Socket-Deskriptor für eine andere Verbindung abhören können.

Die Eindeutigkeit in TCP ist auf Sitzungsebene. Mit anderen Worten, das 5-Tupel (Quell-IP, Quell-Port, Ziel-IP, Ziel-Port, Protokoll) muss eindeutig sein, damit Pakete nicht verwirrt werden, wohin sie gehen.

Sie können Tausende von Clients mit einem bestimmten dest-ip/dest-port-Paar sprechen (wie die große Anzahl von Leuten, die gerade stackoverflow.com:80 erreichen).

Also ja, Sie sind erlaubt zu tun, was Sie tun.

Was Sie können finden, ist, wenn Sie versuchen, an diesen Port zu binden, während noch Sitzungen im TIME_WAIT-Zustand sind, dürfen Sie nicht binden. Dies verhindert, dass Live-Pakete einer vorherigen Sitzung im Netzwerk eintreffen und Ihre Sitzung beeinträchtigen.

Mehr Informationen über TIME_WAIT und warum sie gebraucht werden kann in this excellent answer :-)

Verwandte Themen