Seite 1 von 1

UDP adress cannot be bind

Verfasst: Samstag 11. November 2017, 17:34
von mika2017
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

Code: Alles auswählen

import socket
import sys
import time


while True:
   
    # Create a UDP socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
   
    server_address = ('192.168.8.107', 10000)
    message = b'This is the message.  It will be repeated.'
   
   
    start=time.perf_counter()    
    try:
   
        # Send data
        print('sending {!r}'.format(message))
        sent = sock.sendto(message, server_address)
   
        # Receive response
        print('waiting to receive')
        data, server = sock.recvfrom(4096)
        print('received {!r}'.format(data))
   
    finally:
        print('closing socket')
        sock.close()
   

    stop= time.perf_counter();
    print(stop-start)
    time.sleep(0.5)



Server.py - IP:192.168.8.107

Code: Alles auswählen

import socket
import sys

# Create a UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# Bind the socket to the port
server_address = ('192.168.8.1', 10000)
print('starting up on {} port {}'.format(*server_address))
sock.bind(server_address)

while True:
    print('\nwaiting to receive message')
    data, address = sock.recvfrom(4096)

    print('received {} bytes from {}'.format(
        len(data), address))
    print(data)

    if data:
        sent = sock.sendto(data, address)
        print('sent {} bytes back to {}'.format(
            sent, address))


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. :(

Re: UDP adress cannot be bind

Verfasst: Samstag 11. November 2017, 18:12
von Sirius3
@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.

Re: UDP adress cannot be bind

Verfasst: Samstag 11. November 2017, 21:19
von mika2017
Hey Sirius3!
Ich danke dir! UDP wegen der geringen Latenz? Es sollen nur ein paar Messwerte übertragen werden.

Re: UDP adress cannot be bind

Verfasst: Samstag 11. November 2017, 21:50
von Sirius3
Hast Du ein Problem mit Latenz?

Re: UDP adress cannot be bind

Verfasst: Samstag 11. November 2017, 22:10
von sls
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.

Re: UDP adress cannot be bind

Verfasst: Sonntag 12. November 2017, 10:55
von Sr4l
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.