UDP adress cannot be bind

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

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. :(
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@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

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

Hast Du ein Problem mit Latenz?
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

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.
When we say computer, we mean the electronic computer.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

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.
Antworten