Für eine UDP-Server-Architektur, die langlebige Verbindungen haben wird eine Architektur einen Socket haben, der den gesamten eingehenden UDP-Verkehr überwacht Erstellen Sie separate Sockets für jede Verbindung mithilfe von connect(), um die Remoteadresse festzulegen. Meine Frage ist, ob es möglich ist, dies atomar ähnlich zu tun, was accept() für TCP tut.Emulation accept() für UDP (Timing-Problem beim Einrichten demultiplexter UDP-Sockets)
Der Grund für die Erstellung eines separaten Sockets und die Verwendung von connect() ist, dass es so einfach ist, die Paketverarbeitung über mehrere Threads zu verteilen und den Socket direkt mit den benötigten Datenstrukturen zu verknüpfen zum Bearbeiten. Die Demultiplexierungslogik im Netzwerkstapel leitet die eingehenden Pakete an den spezifischsten Socket weiter.
Nun meine Frage ist im Grunde, was passiert, wenn man will() für UDP so emulieren akzeptieren:
Verwendung select() mit einem fd-Satz, der den UDP-Server-Socket enthält.
Dann lesen Sie ein Paket aus dem UDP-Server-Socket.
dann einen neuen UDP-Socket erzeugen, die dann
I select() aufrufen, mit einer fd-Set an die entfernte Adresse() Ed verbinden, die die beiden Buchsen umfaßt.
Was wird zurückgegeben?
gegeben, dass ein Paket irgendwo nach dem OS kommt zwischen 1 und 3.
wird das Paket an den Server-UDP-Socket demultiplext werden, oder wird es in 3 erstellt der spezielleren Buchse demultiplexiert werden Das heißt, wann findet Demultiplexing statt? Wenn das Paket eintrifft, oder muss es "als ob" geschehen, ist es bei Punkt 4 angekommen?
Follow-up-Frage für den Fall, dass das obige nicht funktioniert: Was ist der beste Weg, dies zu tun?
Sind Sie sicher, dass Sie sogar einen neuen UDP-Socket erstellen können, der mit dem anderen Ende verbunden ist und immer noch denselben serverseitigen Port hat? Normalerweise würden Sie einen UDP-Socket auf einem anderen Port auf der Serverseite erstellen, der "Server-Socket" wird nur für die erste Anfrage verwendet, die weitere Kommunikation mit einem Peer findet an 2 verschiedenen Ports statt. Oder einfach nur 1 Socket auf dem Server verwenden, und es ist nicht wichtig, es zu verbinden, müssen Sie nur die Peers-Adresse notieren. UPD ist sowieso verbindungslos. – nos