UDP Server mir raspi

Gast #6728735
Lesenswert?

Guten Tag,

ich bin gerade dabei ein kleines Programm mit python zu schreiben. 
Eshandelt sich hierbei um einen simplen UdpServer.
1
import socket
2
 sock = socket.socket(socket.AF_INET, # Internet socket.SOCK_DGRAM) # UDP
3
 sock.bind(("x.x.x.x", 4000))
4
 while True:
5
     data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
6
     print("received message: %s" % data)

Fehlermeldung:
  File "UdpServer.py", line 2
    sock = socket.socket(socket.AF_INET, # Internet socket.SOCK_DGRAM) # 
UDP
    ^
IndentationError: unexpected indent
Gast #6728824
Lesenswert?

1
import socket
2
import sys
3

4
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
5

6
server_address = ('192.168.10.40', 4000)
7
sock.bind(server_address)
8

9
sock.listen(1)
10

11
while True:
12

13
    connection, client_address = sock.accept()
14

15
    try:
16
        print >>sys.stderr, 'connection from', client_address
17

18
        # Receive the data in small chunks and retransmit it
19
        while True:
20
            data = connection.recv(16)
21
            print >>sys.stderr, 'received "%s"' % data
22
            if data:
23
                print >>sys.stderr, 'sending data back to the client'
24
                connection.sendall(data)
25
            else:
26
                print >>sys.stderr, 'no more data from', client_address
27
                break
28

29
    finally:
30
        # Clean up the connection
31
        connection.close()

Wenn ich diesen Code in Python ausführe kommt diese Fehlermeldung:

Traceback (most recent call last):
  File "UdpServer.py", line 7, in <module>
    sock.bind(server_address)
  File "/usr/lib/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 99] Cannot assign requested address
#6728827
Lesenswert?

Das sieht nach klassischer Copy/Paste-"Programmierung" aus. Irgendwelche 
Code-Stücke so lange planlos ausprobieren, bis irgend etwas irgend etwas 
tut oder auch nicht.

Ohne die allereinfachsten Grundkenntnisse zu Python, Sockets, und 
überhaupt allem, was du da versuchst, wird das nichts.

Oliver
Gast #6729048
Lesenswert?

from socket import *

serversock = socket(AF_INET, SOCK_DGRAM)
ADDR = (HOST, PORT)
serversock.bind(ADDR)
print 'waiting for UDP connection on port', PORT

while 1:
  data, sender_addr = serversock.recvfrom(128)
  #print 'Req: ',data

  try:
    resp = handle_Request(data)
  except:
    resp = 'NAK'

  resp += "\n"
serversock.sendto(resp, sender_addr)
Gast #6729087
Lesenswert?

Udo schrieb:
> from socket import *

Bittebitte diese Unsitte nicht noch weiter verbreiten. Wildcard-Imports 
sind in Ordnung, wenn man mal schnell was im CLI ausprobieren muss, 
ansonsten nicht. Die Fähigkeit, den Namensraum sauber zu halten, gehört 
zu den Stärken von Python, aber man muss sie auch nutzen. Wenn das 
Skript erst einmal wächst, ist es dafür zu spät, also muss man das von 
Anfang an konsequent richtig machen.
Gast #6729606
Lesenswert?

Guten Morgen,

ich habe nach wie vor ein Problem mit dem UDP Server auf dem raspberry 
pi.
Es erscheint immer diese Meldung:
1
Traceback (most recent call last):
2
  File "test.py", line 7, in <module>
3
    sock.bind(("192.168.178.45", 8000))
4
OSError: [Errno 99] Cannot assign requested address
1
import socket
2
import sys
3

4
bufferSize = 1024
5

6
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
7
sock.bind(("192.168.178.45", 8000))
8

9
while(True):
10
        data = sock.recvfrom(bufferSize)
11
        print(data)

Mein Programm ist ja wirklich sehr übersichtlich. Ich sehe da kein 
Fehler.
Gast #6729626
Lesenswert?

ss -lun
1
State     Recv-Q    Send-Q       Local Address:Port        Peer Address:Port
2
UNCONN    0         0                  0.0.0.0:45106            0.0.0.0:*
3
UNCONN    0         0                  0.0.0.0:68               0.0.0.0:*
4
UNCONN    0         0                  0.0.0.0:631              0.0.0.0:*
5
UNCONN    0         0                  0.0.0.0:5353             0.0.0.0:*
6
UNCONN    0         0                        *:57936                  *:*
7
UNCONN    0         0                        *:5353                   *:*
#6729635
Lesenswert?

Wer einen Server aufsetzt, egal ob TCP oder UDP, schreibt gerne 0.0.0.0 
als IP-Adresse ins bind(), an Stelle einer festen Adresse. Weils dann 
unabhängig von der Adresse des Servers immer dessen diverse Adressen 
sind, loopback/127.0.0.1 inklusive. Das sieht man auch am Output von 'ss 
-lun'.
Gast #6729831
Lesenswert?

Leo schrieb:
> IndentationError: unexpected indent

Hallo Leo, die praktischen Tipps, die Du bisher erhalten hast, waren und 
sind ja zielführend. Meine Überlegungen gehen daher in eine andere 
Richtung und betreffen Deine... grundsätzliche Lösungsstrategie. Schau, 
Programmieren ist nicht einfach, Netzwerke sind nicht einfach, 
Netzwerkprogrammierung multipliziert die Komplexität beider Aspekte -- 
und manche würden sogar nicht ganz zu Unrecht sagen, daß dabei sogar 
eher eine Potenzierung als eine Multiplikation zur Anwendung kommt. Und 
auch wenn Python eine besonders leicht zu erlernende Programmiersprache 
ist, hat es in manchen Bereichen doch seine Tücken und Fallstricke...

Zunächst sehe ich, daß Du offensichtlich die Einstiegskapitel zum Thema 
Python entweder nicht gelesen oder vielleicht auch nicht verstanden hast 
-- sonst wäre Dir der von mir zitierte Syntaxfehler nicht unterlaufen, 
oder Du hättest ihn selbst verstehen und beheben können. Außerdem 
benutzt Du noch Python2, aber das ist schon seit eineinhalb Jahren tot.

Dann lese ich, daß Du einen UDP-Server schreiben möchtest, aber bei 
Deinem Versuch das socket-Modul und so ausgerechnet eine relativ 
systemnahe Bibliothek benutzen willst -- anstatt zum Beispiel die 
wesentlich komfortablere Standardbibliothek socketserver zu benutzen. 
Zudem versuchst Du, Befehle mit UDP zu benutzen, die zu TCP gehören, 
verhaust die Nummer mit den IP-Adressen, und... ehrlich gesagt habe ich 
so ein bisschen das Gefühl, daß Du (wie so viele) UDP nur deswegen 
benutzen willst, weil es Dir ein bisschen einfacher erscheint, kann das 
sein?

Wie dem auch sei: niemand bedauert es mehr als ich, Dir sagen zu müssen, 
daß das so nicht funktionieren wird. Von irgendwoher irgendwelchen Code 
zusammen zu kopieren und dann auf einem Deiner Systeme auszuführen, ohne 
zu verstehen, was der Code tut, ist ein gravierendes Sicherheitsproblem. 
Dieses Sicherheitsproblem wird noch größer, wenn der betreffende Code 
einen Netzwerkserver startet, über den von anderen Systemen auf das 
Deine zugegriffen werden kann.

Insofern bitte ich Dich: arbeite erst einmal ein gutes Tutorial zu 
Python durch, hier [1,2] (englisch) oder [3] (deutsch) gibt es ganz gute 
Tutorials im Internet, als Bücher sollen zum Einstieg die Bücher "Python 
für Dummies" und "Programmieren lernen mit Python" recht gut sein, 
vielleicht haben andere in diesem Thread noch bessere Empfehlungen. Wenn 
Du Dir ein entsprechendes Online-Tutorial oder Buch ausgesucht hast, 
dann arbeitest Du es durch, probierst die Codebeispiele aus, veränderst 
sie und arbeitest Dich so erst einmal in die Programmierung an sich und 
insbesondere natürlich in die Sprache Python ein. Plane dafür ruhig 
einige Wochen ein und stell sicher, daß Du das Gelernte nicht nur 
abtippen kannst, sondern auch verstanden hast. Viel Spaß und Erfolg 
dabei!


[1] https://www.learnpython.org/
[2] https://docs.python.org/3/tutorial/
[3] https://py-tutorial-de.readthedocs.io/de/python-3.3/

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren