TCP send

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
chq
User
Beiträge: 13
Registriert: Mittwoch 27. Februar 2019, 19:44

Hallo,

ich möchte gerne via einer Funktion ein TCP-Paket versenden. Es geht mir lediglich darum, das Paket zu versenden. Ob das Paket ankommt interessiert mich nicht. Der folgende Code funktioniert:

Code: Alles auswählen

def tcpSend(string):
    TCPSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    TCPSock.connect((tcpIP, tcpPort))
    TCPSock.send(string.encode())
    TCPSock.close()
    return
Ist gegen diese Vorgehensweise etwas einzuwänden und falls ja, was?

Gruß Chris
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@chq: Es gibt keine TCP-Pakete. TCP ist ein Datenstrom. Ich würde `sendall()` verwenden, denn `send()` garantiert nicht das alles was übergeben wurde, auch tatsächlich versendet wurde.

Die Namensschreibweisen halten sich nicht an die üblichen Konventionen. In Python klein_mit_unterstrichen für alles ausser Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Die IP und der Port werden einfach so magisch aus der Umgebung genommen. Die sollten entweder als Argumente in die Funktion kommen, oder es sollten Konstanten sein, und entsprechend Gross geschriebene Namen verwenden.

Socketobjekte sind „contextmanager“ und können mit ``with`` verwendet werden.

Das ``return`` am Ende macht keinen Sinn, die Funktion kehrt auch ohne zum Aufrufer zurück.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
chq
User
Beiträge: 13
Registriert: Mittwoch 27. Februar 2019, 19:44

Daaaaankeschön!!

Gruß Chris
chq
User
Beiträge: 13
Registriert: Mittwoch 27. Februar 2019, 19:44

__blackjack__ hat geschrieben: Freitag 1. März 2019, 12:46Die IP und der Port werden einfach so magisch aus der Umgebung genommen. Die sollten entweder als Argumente in die Funktion kommen, oder es sollten Konstanten sein, und entsprechend Gross geschriebene Namen verwenden.
Da ich in meinem über 1000-seitigen Python-Fachbuch nichts bzgl. der Definition von "Konstanten" finden konnte, möchte ich an dieser Stelle fragen, wie man diese denn definiert.

IP und Port habe ich bis dato so angegeben:

Code: Alles auswählen

tcpIP = "192.168.2.4"
tcpPort = 23
Gruß Chris
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@chq: Konstanten werden per Konvention GROSS geschrieben, mehr ist da nicht zu tun.
chq
User
Beiträge: 13
Registriert: Mittwoch 27. Februar 2019, 19:44

__blackjack__ hat geschrieben: Freitag 1. März 2019, 12:46Socketobjekte sind „contextmanager“ und können mit ``with`` verwendet werden.
Diesen Satz verstehe ich nicht. Kannst Du mir im Bezug auf diesen Satz schreiben, was ich im Rahmen meines Codes falsch gemacht habe?

Gruß Chris
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Das kann man mit diesen Stichworten in der Dokumentation nachlesen.

Code: Alles auswählen

def tcp_send(ip, port, string):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as stream:
        stream.connect((ip, port))
        stream.sendall(string.encode())
chq
User
Beiträge: 13
Registriert: Mittwoch 27. Februar 2019, 19:44

Sirius3 hat geschrieben: Samstag 2. März 2019, 19:59..in der Dokumentation..
Äh- in welcher? :oops:

Gruß Chris
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die generelle Python-Dokumentation, die einem ja auch Sprach-Konstrukte erklaert.

ZB https://docs.python.org/3/library/stdty ... extmanager
chq
User
Beiträge: 13
Registriert: Mittwoch 27. Februar 2019, 19:44

Danke! :wink:

Gruß Chris
Antworten