Forum: PC-Programmierung UDP Server mir raspi


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Leo (Gast)


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

von (prx) A. K. (prx)


Lesenswert?

Vorher noch nie mit Python gearbeitet?

von Oliver S. (oliverso)


Lesenswert?

Leo schrieb:
> IndentationError: unexpected indent

Leo schrieb:
> sock = socket.socket(socket.AF_INET, # Internet socket.SOCK_DGRAM) # UDP

Wenn die Forensoftware da nicht deinen Sourcecode arg verunstaltet hat, 
dann erklär mal etwas genauer, was davon Code ist, und was Kommentar. 
Der python-Interpreter versteht das auf jeden Fall nicht.

Oliver

von Ergo70 (Gast)


Lesenswert?


von Leo (Gast)


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

von Oliver S. (oliverso)


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

von Lutz (Gast)


Lesenswert?

Was für eine IP hat dein Raspberry denn?

von Leo (Gast)


Lesenswert?

IP raspberry pi: 192.168.10.45

von Mario M. (thelonging)


Lesenswert?

Leo schrieb:
> socket.SOCK_STREAM

Ist TCP.

Leo schrieb:
> sock.listen(1)

Ist TCP.

Leo schrieb:
> sock.accept()

Ist TCP.

Du musst die richtigen Beispiele kopieren!

https://pythontic.com/modules/socket/udp-client-server-example

von Εrnst B. (ernst)


Lesenswert?

Leo schrieb:
> server_address = ('192.168.10.40', 4000)

Leo schrieb:
> IP raspberry pi: 192.168.10.45

Was fällt dir auf, wenn du beide IPs vergleichst?
Was könnte das mit dieser Meldung zu tun haben?

Leo schrieb:
> socket.error: [Errno 99] Cannot assign requested address

von Udo (Gast)


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)

von Heiner (Gast)


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.

von Gerald K. (geku)


Lesenswert?


von Sebastian (Gast)


Lesenswert?

Leo schrieb:
> Fehlermeldung:
> File "UdpServer.py", line 2
> sock = socket.socket(socket.AF_INET, # Internet socket.SOCK_DGRAM) # UDP
> ^
> IndentationError: unexpected indent

Ja, da steht doch die Antwort auf deine Frage ...

LG, Sebastian

von Leo (Gast)


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.

von Mario M. (thelonging)


Lesenswert?

Gestern war die IP des Raspberry doch noch 192.168.10.45?

von (prx) A. K. (prx)


Lesenswert?

Leo schrieb:
> IP raspberry pi: 192.168.10.45

Leo schrieb:
> sock.bind(("192.168.178.45", 8000))

Was fällt dir hier auf?

von Leo (Gast)


Lesenswert?

Bin nun ZUhause deshalb ist auch die IP eine andere.

von (prx) A. K. (prx)


Lesenswert?

Welche? Die Wahrscheinlichkeit, dass zu zufällig wieder .45 hast, ist 
bei nicht festgenageltem DHCP recht überschaubar.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Aber um das Drama abzukürzen: 0.0.0.0 steht für alle lokalen Adressen, 
passt also immer.

von Mario M. (thelonging)


Lesenswert?

Port belegt? Was sagt
1
ss -lun
?

von (prx) A. K. (prx)


Lesenswert?

Mario M. schrieb:
> Port belegt?

Gibt andere Meldung. Nö. bei falscher IP kommt genau diese Meldung.

von Leo (Gast)


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                   *:*

von Mario M. (thelonging)


Lesenswert?

(prx) A. K. schrieb:
> Mario M. schrieb:
>> Port belegt?
>
> Gibt andere Meldung.

Ah OK, dann können wir das auch ausschließen.

von (prx) A. K. (prx)


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

: Bearbeitet durch User
von Nur_ein_Typ (Gast)


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/

von Mario M. (thelonging)


Lesenswert?

Vielleicht doch einfach einen Cloud-IoT-Anbieter nehmen? So wie ich es 
in seinem(?) Parallelthread empfohlen habe.
Beitrag "Re: vodafone auch auf ipv4 umstellen"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.