Socket verbindung wird geschlossen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
_Bamba_
User
Beiträge: 7
Registriert: Samstag 11. Februar 2017, 16:29

Ich wollte in Python eine art TeamViewer machen. Habe erstmal mit einer Verbindung zur Shell angefangen. Bisher Funktionierte alles bis ich einen Befehl eingab dort kahm die Meldung: Die Software hat die Verbindung geschlossen oder sowas in der art.
Jetzt verbindet es gar nicht mehr, es kommt nur der Host hat die Verbindung verweigert. Könnt ihr mit helfen das eine Verbindung entsteht die nicht geschlossen wird?

Server Code:

Code: Alles auswählen

import socket

host = ""
port = 4444
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(1)
connection, addr = s.accept()
print("Connection to " + addr[0])
data = connection.recv(256)
print (data)
while True:
    cmd = raw_input("Command: ")
    connection.send(cmd)
    data = connection.recv(256)
    print(data)
connection.close()
Client Code:

Code: Alles auswählen

import socket
import subprocess

host = "192.168.188.93" 
port = 4444
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((host, port))

s.send("Verbindung aufgebaut")

while True:
    data = s.recv(256)
    proc = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout = proc.stdout.read()
    s.send(stdout)
Zuletzt geändert von Anonymous am Donnerstag 30. März 2017, 10:03, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@_Bamba_: Was auf jeden Fall falsch/fehlerhaft ist, sind Deine `recv()`- und `send()`-Aufrufe. ``recv(256)`` bedeutet *nicht* das 256 Bytes empfangen werden, oder alles was auf der anderen Seite in *einem* `send()`-Aufruf gesendet wurde, sondern das *maximal* 256 Bytes und *minimal* 1 Byte aus dem Datenstrom gelesen werden. Korrekter Code muss im Extremfall damit umgehen können, das `recv()` grundsätzlich immer nur 1 Byte liefert. Man muss das solange aufrufen bis man eine komplette Nachricht beisammen hat. Dazu muss man wissen wie man das feststellt, also das irgendwie in einem Protokoll regeln. Zum Beispiel durch eine Kennung am Ende der Nachricht die garantiert nicht *in* der Nachricht vorkommen kann, oder in dem man die Länge der Nachricht in einer festen Anzahl von Bytes übermittelt und der Empfänger dann solange liest bis er mindestens so viele Bytes beisammen hat. Wenn das Protokoll vollduplex ist, dann muss man ausserdem damit klar kommen, das ein `recv()`-Aufruf auch schon einen Teil der nächsten Nachricht enthalten kann, oder sogar eine oder mehrere komplette Nachrichten, plus eventuell einen Teil einer weiteren Nachricht.

Auf der anderen Seite bedeutet ``send(data)`` nicht das alles in `data` gesendet wird. Das kann auch weniger sein. Wie viel gesendet wurde verrät einem der Rückgabewert von `send()`, das ist nämlich die Anzahl der Bytes die gesendet wurden. Da muss man schauen ob das tatsächlich alles war und `send()` so oft mit dem jeweiligen Rest aufrufen bis wirklich alles übergeben wurde. Oder man verwendet `sendall()`.
Antworten