Problem: Socket Server-Client Port Blockiert

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
silas.py
User
Beiträge: 2
Registriert: Donnerstag 2. April 2015, 18:18

Guten Abend,

ich habe das Problem das mit eingeschalteter Windows Firewall keine TCP Verbindung zwischen meinem Client Socket (der auf meinem Raspberry Pi läuft) und meinem Server Socket (der auf meinem Windows 8.1 Notebook läuft) zustande kommt (keine Fehlermeldung ausser nach längerer Zeit Connection timed out).
Sobald ich die Firewall ausschalte verbinden sich die beiden und alles ist wunderbar. Ich habe jetzt versucht in der Windows Firewall eingehende und ausgehende Regeln zu erstellen und den Port den ich nutze (5005) freizugeben.
Das habe ich meiner Meinung nach auch korrekt gemacht.
Aber leider geht es mit eingeschalteter Firewall weiterhin nicht.

Mein Code für den Client:

Code: Alles auswählen

import socket

host = 'Ip des Servers'
port = 5005
text = 'Hallo'

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port)
s.send(text)
data = s.rescv(1024)
s.close()

print "received data", data
und Code für den Server:

Code: Alles auswählen

import socket


host = '0.0.0.0'
port = 5005

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(1)

conn, addr = s.accept()
print 'Connection address:', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    print "received data:", data
    conn.send(data)  # echo
conn.close()
Hat da vielleicht irgendjemand eine Idee zu?

Grüße
BlackJack

@silas.py: Wenn es bei ausgeschalteter Firewall funktioniert, bei eingeschalteter aber nicht, dann würde ich das Problem bei der Firewall suchen.

Der Code für den Client wird mit einer Ausnahme abbrechen. Ist Dir das nicht aufgefallen oder ist das gar nicht der tatsächliche Quelltext?

Beide sind ausserdem fehlerhaft weil sie `send()` auf Sockets verwenden ohne sicherzustellen das tatsächlich alles gesendet wurde. Das kann man selber programmieren, man könnte aber auch einfach `sendall()` verwenden.

Für die `recv()`-Methode gilt das gleiche: Man muss die so oft aufrufen bis man sicher alle Daten zusammen hat die man braucht. Beim Echo-Client also so lange bis garantiert alles was man gesendet hat ausgelesen wurde.
silas.py
User
Beiträge: 2
Registriert: Donnerstag 2. April 2015, 18:18

Ne der Code für den Client hab ich auf die schnelle abgetippt. Ok ich erzähl vielleicht erstmal eben worum es eigentlich geht.
Also ich habe erstmal diesen Echo-Server geschrieben um zu schauen wie man den Pi mit einem Notebook über das LAN verbindet. Im Endeffekt möchte ich an dem Pi eine Klingel anschließen und wenn man Klingelt dann soll das auf dem Laptop angezeigt werden (später auf dem Handy). Ich weiß nicht ob es dafür eine einfachere Lösung gibt als TCP, ich hab aber irgendwie nichts anderes gefunden. Ja und im Prinzip steht die Verbindung ja auch erstmal, das Problem ist halt nur die Firewall.

Ich erklär jetzt mal eben wie ich den Port freigegeben habe (Windows 8.1): Systemsteuerung -> System und Sicherheit -> Windows Firewall -> Erweiterte Einstellungen -> Eingehende Regel -> Neue Regel -> Auf Port und Weiter -> Auf TCP, den Port 5005 eingetragen und Weiter -> Auf Verbindung zulassen und Weiter -> Auf Domäne Privat und Öffentlich anwenden und Weiter -> Name eingegeben und weiter.
Und das gleiche hab ich für ausgehende Regel gemacht.

Grüße
Antworten