Forum: PC-Programmierung Frage zu udp server


von python_user (Gast)


Lesenswert?

Hallo,

ich habe für Testzwecke ein kleines python Skript geschrieben.
Mit diesem Programm sollen quasi alle UDP Nachrichten die empfangen 
werden
angezeigt werden. SObald ich eine öffentlich IP benutze erscheint diese 
Meldung:
1
Traceback (most recent call last):
2
  File "udpServer.py", line 7, in <module>
3
    sock.bind((UDP_IP, UDP_PORT))
4
OSError: [Errno 99] Cannot assign requested address

Sobald ich eine lokale IP verwende erscheint diese Meldung nicht.

python Skript:
1
import socket
2
3
UDP_IP = "xxx.xxx.xxx.xxx"
4
UDP_PORT = 1000
5
6
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
7
sock.bind((UDP_IP, UDP_PORT))
8
9
while True:
10
     data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
11
     print("received message: %s" % data)

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Tja, das dürfte daran liegen das dein Rechner eben kein Interface mit 
der Öffentlichen IP besitzt, die hat dein Router und der routet das dann 
auf die lokale Adresse deiner Netzwerkkarte.
Oder hat eine deiner Netzwerkkarten tatsächlich eine öffentliche IP?

von Dirk B. (dirkb2)


Lesenswert?

python_user schrieb:
> SObald ich eine öffentlich IP benutze erscheint diese
> Meldung:

Eine?
Wieviele öffentliche IP hat denn der Rechner?

von python_user (Gast)


Lesenswert?

Muss wohl noch was mit dem Routing gemacht werden.

von Dirk B. (dirkb2)


Lesenswert?

Du kannst nur IP-Adressen nehmen, die deinen Netzwerkkarten (im Rechner) 
zugeordnet sind.

Wenn du einen Router (FRitz!Box o.Ä.) hast, kannst du da über NAT gehen.
Da behält dein Rechner aber seine lokale IP.

von (prx) A. K. (prx)


Lesenswert?

Dirk B. schrieb:
> kannst du da über NAT gehen

Wird in dieser Richtung gerne als port forwarding bezeichnet.

von Local Area Notwork (Gast)


Lesenswert?

python_user schrieb:
> Hallo,
>
> ich habe für Testzwecke ein kleines python Skript geschrieben.
> Mit diesem Programm sollen quasi alle UDP Nachrichten die empfangen
> werden
> angezeigt werden. SObald ich eine öffentlich IP benutze erscheint diese
> Meldung:
>
1
> Traceback (most recent call last):
2
>   File "udpServer.py", line 7, in <module>
3
>     sock.bind((UDP_IP, UDP_PORT))
4
> OSError: [Errno 99] Cannot assign requested address
5
>


Mit anderen Worten: deine Umsetzung (und die muss über das schreiben 
eines Programms hinausgehen) entspricht nicht deinen Erwartungen.

Dein Netzwerkprogramm kann nur funktionieren wenn es auf die 
Netzwerkkonfiguration des Rechners passt/rücksicht nimmt.
Da kann das Programm nicht beliebigen Netzwerkverkehr "sehen" sondern 
bloss den welcher tatsächlich zu/durch dessen Netzwerkinterfaces kommt.
Stichworte: node address, subnet mask.

Also sollte dein Netwerkprogramm zuerst das Betriebssystem fragen wie es 
ums Netzwerk steht und bloss die entsprechend passende Auswahl (an 
Adressen) anbieten/zulassen.

---

Obendrein wird auch nur jener Netzwerkverkehr "sichtbar" der tatsächlich 
im/in den (lokalen, angeschlossenen) Netz(e) überhaupt vorhanden ist.

Auf weiteren Ebenen muss entspr. ein andrer Knoten (Router, Gateway) 
ggfs. dafür sorgen dass Netzwerkverkehr von anderen Netzten in ein 
(lokales, angeschlossenes) Netz gelassen/dupliziert wird.
Erst dann kommt "fremder" Netzwerkverkehr überhaupt bis zum Rechner wo 
dein Netzwerkprogramm rennt.

von Dave (Gast)


Lesenswert?

Du könntest 0.0.0.0 als IP Eintragen damit das Script auf allen IPs des 
Rechners lauscht.
Dazu musst du noch beachten, dass du ggf. Administratorrechte benötigst 
um dich auf Port 1000 zu binden.

von (prx) A. K. (prx)


Lesenswert?

Dave schrieb:
> Du könntest 0.0.0.0 als IP Eintragen damit das Script auf allen IPs des
> Rechners lauscht.

Wenn der Rechner eine öffentlicbe IP hat (s.o.) ist das nicht nötig, und 
wenn er wie hier keine hat, nützt es nichts.

von Dave (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Wenn der Rechner eine öffentlicbe IP hat (s.o.) ist das nicht nötig, und
> wenn er wie hier keine hat, nützt es nichts.

Doch natürlich, das Script wäre von der IP unabhängig und würde zunächst 
einmal starten. Um das NAT muss er sich ohnehin an anderer Stelle 
kümmern.

von (prx) A. K. (prx)


Lesenswert?

Dave schrieb:
> Um das NAT muss er sich ohnehin an anderer Stelle kümmern.

Yep, so stimmts. ;-)

von python_user (Gast)


Lesenswert?

Vielen Dank!

Es funktioniert.

von foobar (Gast)


Lesenswert?

Wenn man keine besonderen Anforderungen hat, ist 0.0.0.0 die richtige 
Adresse - dann ist der Dienst auf allen Interfaces (inkl localhost) 
verfügbar.

Wenn der Dienst nur lokal auf diesem Rechner verfügbar sein soll, wird 
127.0.0.1 genommen.

Alles andere ist eher die Ausnahme - dann weiß man aber, warum man das 
macht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.