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?

War es hilfreich?

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.

Beej Guide to Network Programming

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top