Wie UDP sendet und empfängt auf demselben Port?

8

Ich muss in der Lage sein, UDP-Pakete auf demselben Port zu senden und zu empfangen. Ich bin in der Lage zu hören, sagen wir Port 5000, aber mein send verwendet einen zufälligen hohen Port. Das System, das ich in VB geschrieben habe, tut dies und ich muss einen UDP-Responder schreiben, um verschiedene Protokollprobleme zu beheben.

Ich benutze die Open Source C ++ Sockets Library von Ссылка (Anders Hedstrom) und konnte den UdpSocket :: Bind ( ), um eingehende UDP-Pakete mit der virtuellen Funktion UdpSocket :: OnRawData () zu empfangen, konnte aber nicht bewirken, dass UdpSocket :: Open () (Aufrufe verbinden) den UdpSocket :: Send () den in Bind ausgewählten Port verwendet ( ) (es verwendet stattdessen einen zufälligen Port mit hoher Nummer).

Das Verschieben der Open () Funktion hilft nicht. Ich habe eine Anfrage in ihrem Forum gepostet - aber glaube von dem, was ich gelesen habe, dass es möglich sein sollte, dies zu tun, und ich verstehe wahrscheinlich nicht, wie man UDP benutzt.

Hat jemand irgendwelche Ideen, was ich ausprobieren soll?
- Danke -

    
cedgriss 28.10.2009, 22:54
quelle

2 Antworten

8
  

System besteht aus einer Anzahl von Knoten   Hören auf dem gleichen Port (andere IP   Adres). System [A] sendet Datagramm an   System [B]. System [B] asynchron   antwortet und sendet Datagramm (e) zurück an   [A] alle mit demselben Port. Auch wenn [B]   identifiziert [A] den Port, [A] ist nicht   an diesem Port hören

Ich bin mir nicht sicher, ob ich den Satz "alles mit demselben Port" in diesem Satz verstehe. Wenn A ein Datagramm an B sendet, erkennt B die IP und den Port von A sofort (eine schnelle Überprüfung Ihrer Bibliotheksdokumentation zeigt, dass OnRawData einen struct sockaddr *sa -Parameter hat, wenn Sie es in sockaddr_in* umsetzen IP: Portpaar). Sie können den IP: Port zum Senden von Datagrammen verwenden und A wird sie empfangen. A "hört" auf diesem Port nicht in dem Sinne, dass er nicht listen () auf dem Socket aufgerufen hat, sondern weil A einen Socket besitzt, der an diesen Port gebunden ist (ob explizit durch Aufruf von bind () oder durch zufälligen Port zugewiesen das OS) wird es die Daten erhalten.

Wenn Sie jetzt ALLE Ihre Kommunikation zwischen den Knoten über Ihren festen Port durchführen wollen, können Sie das tun. Sie müssen nur alle Ihre Datagramme über Ihre "hörende" Buchse senden. Wenn jeder Knoten auf demselben Port "hört", bedeutet dies, dass jeder Knoten einen Socket besitzt, der an diesen Port gebunden ist. Wenn Datagramme von A nach B gesendet werden sollen, die von diesem festen Port kommen, müssen Sie sie über diesen Socket senden. Ich vermute, das ist, warum bind () funktioniert nicht für Ihren sendenden Socket - A hat einen Socket an Port X gebunden, dann erstellen Sie einen anderen Socket und versuchen, es an den gleichen Port X zu binden, bind () fehlschlägt seit dem Port ist bereits vergeben (und Sie prüfen nicht auf Fehler :), und dann das Betriebssystem zufällige freie Port über 1024.

Hinweis 1: Ich benutze überall "Anhören" in Anführungszeichen, weil das Konzept im Kontext von UDP-Sockets nicht klar ist. Sobald Sie einen Socket erstellt und an einen Port gebunden haben, können Sie entweder durch explizites Aufrufen von bind () oder durch das Senden von Daten und die Bindung des Betriebssystems an einen Port Daten von überall her empfangen. Keine listen () oder accept () Anrufe benötigt.

Hinweis 2: Sie sagen, dass UdpSocket :: Open () connect () aufruft, aber das macht nicht viel Sinn - connect () tut sehr wenig für UDP-Sockets - es stellt lediglich eine Standardadresse her, so dass Sie senden können () anstelle von sendto () und keine Adresse bei jedem Senden angeben.

Hoffe, dass die Dinge klar werden.

Bearbeiten, um den Kommentar von OP zu adressieren: Ich habe diese Bibliothek noch nie benutzt, aber laut ihrer UdpSocket-Dokumentation gibt es 4 Überladungen der Bind () Methode und jeder einzelne von ihnen akzeptiert Port in irgendeiner Weise. Keiner von ihnen funktioniert für Sie?     
sbk 29.10.2009 10:55
quelle
3

Eine bidirektionale Kommunikationsverbindung beinhaltet immer zwei Teilnehmer: eine Serverseite und eine Clientseite.

Der Client erwartet, mit einem Server an einem definierten Port zu kommunizieren: deshalb muss auf der Serverseite eine Bindung () an einen Socket erfolgen.

Auf der Client-Seite muss man einen Socket zum Server öffnen: Es spielt keine Rolle, welcher Socket gewählt wird (abgesehen davon, dass er frei sein muss).

Mit anderen Worten, versuchen Sie nicht, einen Socket auf der Clientseite anzugeben: der Netzwerkprotokollstapel weist ihn Ihrem Client zu.

    
jldupont 28.10.2009 23:08
quelle

Tags und Links