Wann wird eine Steckdose genügt, wann muss ich mehr schaffen?
-
27-09-2019 - |
Frage
Der „verbindungslos“ Aspekt von UDP ist für eine Schleife geworfen mich ...
Wenn ich ein Setup UDP Socket Set INADDR_ANY, dann binden, dass auf Port 33445 auf dem lokalen Computer, die Maschine eingehende Verbindungen von verschiedenen Clients akzeptiert. Alle diese Verbindungen werden durch diese eine Steckdose bedient werden, da dies nicht TCP ist, und ich kann nicht ein neues Kind Steckdosen Laichen jede Verbindung direkt zu handhaben. Ich bin in der Lage zu allen, einige oder alle dieser verbundenen Clients zu antworten, aus ihrer aktuellen Nachricht.
Also, wo die Dinge für mich ein wenig unscharf bekommen, ist hier ...
Bin ich auch in der Lage Nachrichten zu jedem dieser Kunden jederzeit aussenden? oder kann ich nur Nachrichten senden, die in Antwort von Recvfrom ()?
Unabhängig davon, ob ich diesen Server wollte (während es Kunden dient) auf einem anderen Server zu verbinden und ein Gespräch über etwas anderes, gehe ich davon aus ich brauche eine neue Buchse für diesen Zweck zu schaffen? Ich kann nicht nur den bestehenden Server-Socket verwenden und eine neue Zieladresse angeben?
Vielen Dank an dieser wunderbaren Gemeinschaft.
Edit: Lassen Sie es mich einen anderen Weg .. Es scheint zu sein, dass ich nur die gebundene Fassung für die Reaktion auf Kunden verwenden können, die mich auf diesem Sockel zuvor erreicht haben. Um initiieren ein Gespräch mit einem neuen Host, ich kann einfach nicht die gebundene Fassung für diesen Zweck verwenden? Ich muss einen neuen Socket erstellen, um einen Server zu erreichen, der zuhört, nicht wahr?
Lösung
UDP-Sockets kann in zwei verschiedenen Modi betrieben werden:
- default nicht-verbunden Modus: alle Datagramme zum Hafen / Adresse Ihres Prozesses gesendet werden, empfangen werden; Sie müssen Zieladresse für jeden Senden Sie tun. angeben
- verbunden Modus: nur die gesendeten Datengramme von der Adresse / Port Sie empfangen verbunden ist; Sie nicht auf jedem Sende angeben Zieladresse benötigen.
Hier ist eine kleine Übersicht von verbunden UDP-Sockets .
Edit:
Hier ist eine kleine Python UDP-Server, der sie Pakete von jedem Client und Kopien auf einem zweiten Server akzeptiert. Alles wird getan, mit einem nicht-verbundenen UDP-Sockets.
#!/usr/bin/env python
import sys, socket, string
if len( sys.argv ) != 4:
print "Usage: udptee <local-listen-port> <copy-host> <copy-port>"
exit( 1 )
copy = ( sys.argv[2], int( sys.argv[3] ))
s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
#s.bind(( 'localhost', int( sys.argv[1] )))
s.bind(( '', int( sys.argv[1] )))
print "listening on ", s.getsockname()
print "copying to", copy
while True:
line, addr = s.recvfrom( 1024 )
print "received: ", line, " from ", addr
s.sendto( line, addr ) # echo to source
s.sendto( line, copy ) # copy to tee
if string.strip( line ) == "exit": break
print "Goodbye and thanks for all the fish"
s.close()
Ausführen es in einem Terminal, wie:
~$ ./udptee 9090 <IP-of-copy-server> 9999
Dann starten netcat
im Server-Modus in der zweiten Begriff. Dieser wird Kopien der Datagramme akzeptieren:
# this used to be "nc -ul 127.0.0.1 9999" which only listened on loopback
~$ nc -ul 9999
Start netcat
Client auf dem dritten Begriff zu schicken Sachen an den ersten Server:
~$ nc -u <IP-of-tee-server> 9090
Starten Sie die Eingabe und sehen beide Server wiederholen, was Sie eingeben.
Andere Tipps
UDP-Sockets sind nicht auf einem Remote-Host oder Client verbunden sind, so alles, was Sie tun müssen, ist sendto () zu verwenden, mit der Zieladresse und die UDP-Sockets Sie initialisiert haben. Also ja, können Sie out-Nachrichten senden, um den UDP-Socket jederzeit über die angegebenen, dass Sie richtig die UDP-Sockets einzurichten. Stellen Sie einfach die Empfangsadresse in der sockaddr struct Sie verwenden. Wenn das Aufnahmeteil einen UDP-Socket an den Port gebunden haben Sie die Nachricht senden, dann wird es es erhalten.
Auf dieser zweite Frage es hängt alles davon, ob das Gespräch mit dem zweiten Server einen anderen Port verwendet. Wenn sie den gleichen Port verwendet dann gibt es keine Notwendigkeit, eine andere UDP-Sockets zu erstellen. Sie müssen nur die Nachrichten trennen den Server 1 von seinen Kunden aus den Nachrichten wird es vom Server 2 irgendwie bekommt.
Ill empfehlen einen Blick auf Beej ausgezeichneten Führungs Kapitel 5.8 und 6.3 unter.