2013-04-12 8 views
5

Ich schreibe auf UDP-Server/Client-Anwendung.40 Sockets an 40 verschiedene IP-Adressen binden

Ich möchte, dass mein einzelner Server 40 Clients gleichzeitig verarbeitet. Dazu möchte ich 40 dedizierte Threads erstellen, von denen jeder für einen einzelnen Client bestimmt ist. Da es für jeden Client 40 Threads gibt, möchte ich auch 40 dedizierte Sockets erstellen.

Aber das Problem, dass:

Ich weiß nicht, was die IP 40 wird adressiert, an die ich binden() meine Steckdosen. (So ​​weit ich jetzt bin, muss ich an die IP-Adresse meines Servers binden.) Normalerweise binde ich() an "INADDR_ANY", wenn es nur einen einzigen Socket gibt.

Aber was sollten die IP-Adressen sein, an denen ich() jeden meiner 40 Sockel binden sollte? Bitte helfen Sie mir. Jeder Kommentar/Hilfe wird geschätzt.

+0

Benötigen Sie 40 Sockets (Socket-Adressen) oder 40 IP-Adressen? Wird dein Gastgeber so viele haben? –

Antwort

2

Ein üblicher Weg, dies mit UDP zu tun ist:

  • Server bind() zu einem bekannten Port.
  • Client sendet das erste Paket an diesen bekannten Port
  • Server erhalten das erste Paket von einem Client auf dem bekannten Port.
  • Server erstellt einen neuen Socket mit einem zufälligen Port
  • Server antwortet auf den Client von diesem neuen Socket.
  • Der Client empfängt die Antwort, bemerkt, dass er von einem anderen Port als dem bekannten Serverport kommt, und verwendet diesen Port als Ziel für die weitere Kommunikation.

Sie verwenden den Aufruf getpeername(), um die entfernte Adresse zu lernen.

Denken Sie daran, dass UDP verbindungslos ist, benötigen Sie eine Möglichkeit, das Ende oder Timeout von Sockets zu signalisieren.

1

Der übliche Weg ist bind eine einzige socket und accept eingehende Verbindungen. Jeder Verbindung wird durch accept ein eindeutiger Socket zugewiesen.

Da Sie UDP verwenden, würde ich einfach TCP wie oben beschrieben verwenden, um die Clients über ihre jeweiligen Server-UDP-Adressen zu informieren.

+1

accept() ist für TCP, während ich an UDP arbeite. – Ayse

+0

Es ist die Anforderung meines Systems, 40 Sockets zu erstellen. Nun ist das Problem, dass ich nicht weiß, welche IP-Adressen an diese 40 Sockets bind() ed sein müssen :( – Ayse

+0

@Ayesha Hassen: Ich erweiterte meine Antwort zu Adresse UDP. –

2

bind benötigt nur die lokale Adresse, nicht die entfernte Adresse.

Wenn Sie für jeden Client einen Socket benötigen, müssen Sie für jeden Client unterschiedliche Ports verwenden (mit bind). Auf diese Weise kann jeder Client seinen Datenverkehr an einen dedizierten Port senden, und Sie können für jeden Socket/Port einen Thread verwenden.

Es ist wahrscheinlich eine bessere Idee, nur einen Socket (und einen Port) zu haben und Logik in Ihrem Code zu haben, um Verkehr zu einem Thread basierend auf der Remote-Adresse zuzuordnen (abgerufen unter recvfrom zB).

+0

Wenn es nur einen einzigen Thread und alle der 40 Clients senden Daten gleichzeitig auf diesem einzelnen Socket, es besteht die Möglichkeit, dass die Daten jedes Clients fallengelassen werden können Aus diesem Grund habe ich die Entwicklung dedizierter Sockets für jeden Client verschoben – Ayse

+1

Wenn Sie wirklich dedizierte Sockets wollen, habe ich erklärt, wie tu das. Ich verstehe nicht, warum du denkst, dass Daten verloren gehen würden, wenn du nur einen Socket verwendest. –

+0

Danke für deine Hilfe :) hat mir wirklich geholfen :) Eine Sache, die ich wissen möchte ist, was das ist Nachteile, wenn ich 40 Threads/Sockets statt eines hörenden Threads erstelle. Jeder scheint gegen diese Idee zu sein. Gibt es dafür gute Gründe? Warum sollte man nicht für jeden Client 40 dedizierte Threads/Sockets erstellen und sich darauf konzentrieren, einen Socket zu erstellen? :( – Ayse

1

Erstellen Sie eine einzelne Abhörbuchse in einem dedizierten Abhör-Thread.

Wenn ein neues Paket empfangen wird, verwenden Sie die Remote-Adr/Port des Pakets oder legen Sie eine eindeutige ClientID in die Paketnutzlast, um den Client eindeutig zu identifizieren.

Erstellen Sie einen neuen Thread für diesen Client, falls noch keiner vorhanden ist, übergeben Sie das Paket an diesen Thread zur weiteren Verarbeitung und kehren Sie zum Abhören zurück.

Wenn ein bestimmter Client-Thread für eine Weile keine Pakete empfängt, kann er sich selbst beenden.

Verwandte Themen