UDP adress cannot be bind

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
mika2017
User
Beiträge: 2
Registriert: Samstag 11. November 2017, 17:05

UDP adress cannot be bind

Beitragvon mika2017 » Samstag 11. November 2017, 17:34

Hallo Leute,

ich möchte drahtlos Daten zwischen 2 linuxsystemen via UDP verschicken.

Der Client.py PC ist zugleich SoftAp(Accesspoint) und der Server.py in diesen SoftAp eingeloggt.

Beide Systeme könne sich gegenseitig anpingen.

Client.py - IP:192.168.8.1
Server.py - IP:192.168.8.107

Es kommt die Fehlermeldung:

sock.bind(server_address)

OSError: [Errno 99] Cannot assign requested address



Client.py - IP:192.168.8.1
  1. import socket
  2. import sys
  3. import time
  4.  
  5.  
  6. while True:
  7.    
  8.     # Create a UDP socket
  9.     sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  10.    
  11.     server_address = ('192.168.8.107', 10000)
  12.     message = b'This is the message.  It will be repeated.'
  13.    
  14.    
  15.     start=time.perf_counter()    
  16.     try:
  17.    
  18.         # Send data
  19.         print('sending {!r}'.format(message))
  20.         sent = sock.sendto(message, server_address)
  21.    
  22.         # Receive response
  23.         print('waiting to receive')
  24.         data, server = sock.recvfrom(4096)
  25.         print('received {!r}'.format(data))
  26.    
  27.     finally:
  28.         print('closing socket')
  29.         sock.close()
  30.    
  31.  
  32.     stop= time.perf_counter();
  33.     print(stop-start)
  34.     time.sleep(0.5)
  35.  
  36.  



Server.py - IP:192.168.8.107
  1. import socket
  2. import sys
  3.  
  4. # Create a UDP socket
  5. sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  6.  
  7. # Bind the socket to the port
  8. server_address = ('192.168.8.1', 10000)
  9. print('starting up on {} port {}'.format(*server_address))
  10. sock.bind(server_address)
  11.  
  12. while True:
  13.     print('\nwaiting to receive message')
  14.     data, address = sock.recvfrom(4096)
  15.  
  16.     print('received {} bytes from {}'.format(
  17.         len(data), address))
  18.     print(data)
  19.  
  20.     if data:
  21.         sent = sock.sendto(data, address)
  22.         print('sent {} bytes back to {}'.format(
  23.             sent, address))
  24.  
  25.  


Wenn man die beiden Skripte via localhost ausführt läuft die Sache.
Weiss jmd. woran es liegen könnte? Bin da jetzt ziemlich ratlos. :(
Sirius3
User
Beiträge: 6553
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: UDP adress cannot be bind

Beitragvon Sirius3 » Samstag 11. November 2017, 18:12

@mika2017: bind erwartet eine Adresse des Servers, an der er lauscht. Meist will man an allen Eingängen lauschen und nimmt die Adresse »0.0.0.0«. Warum verwendest Du überhaupt UDP? UDP ist unzuverlässig und darauf ein funktionierendes Protokoll aufzubauen ziemlich kompliziert.
mika2017
User
Beiträge: 2
Registriert: Samstag 11. November 2017, 17:05

Re: UDP adress cannot be bind

Beitragvon mika2017 » Samstag 11. November 2017, 21:19

Hey Sirius3!
Ich danke dir! UDP wegen der geringen Latenz? Es sollen nur ein paar Messwerte übertragen werden.
Sirius3
User
Beiträge: 6553
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: UDP adress cannot be bind

Beitragvon Sirius3 » Samstag 11. November 2017, 21:50

Hast Du ein Problem mit Latenz?
Benutzeravatar
sls
User
Beiträge: 36
Registriert: Mittwoch 13. Mai 2015, 23:52

Re: UDP adress cannot be bind

Beitragvon sls » Samstag 11. November 2017, 22:10

mika2017 hat geschrieben:UDP wegen der geringen Latenz? Es sollen nur ein paar Messwerte übertragen werden.


In welchem Zyklus? Wenn es sich um ein paar Messwerte, selbst pro Minute handelt, würde ich dennoch zu TCP tendieren. Die Übertragung deiner Messwerte werden einige wenige Bytes sein, was du nicht mal im Ansatz in einem gewöhnlichen Ethernet-Netzwerk spüren würdest.

Das ist keine Echtzeitanwendung wie bspw. Internettelefonie, wo der Datenstrom flüssig sein muss und möglichst Verzögerungsfrei. Es gibt auch Fälle, in denen TCP schneller sein kann als UDP, da TCP in Relation zur MTU die volle Bandbreite des Übertragungsmediums ausnutzen kann, anstatt das Netzwerk mit vielen kleinen Datenpaketen zu "fluten".

Du möchtest sicher sein, dass deine Sensordaten vollständig sind, daher würde ich TCP verwenden.
Benutzeravatar
Sr4l
User
Beiträge: 1083
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Re: UDP adress cannot be bind

Beitragvon Sr4l » Sonntag 12. November 2017, 10:55

Ich würde selbst bei mehrer Messwerte pro Sekunde TCP nutzen.

Ich würde außerdem kein eigens Protokoll erfinden sondern eines von den vielen verwenden die dafür bereits heute eingesetzt werden.
Modbus/TCP oder OPC UA zum Beispiel.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder