Socket unter Windows erzeugt WinError 10022

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

Vor einiger Zeit habe ich mal einen Chat geschrieben, in dem unter Windows und Mac alles wunderbar funktionierte. Doch momentan arbeite ich an einem Spiel und es gibt bei einem einfachen "recvfrom()"-Befehl immer einen Error unter Windows. Hier ein Ausschnitt des Scripts:

Code: Alles auswählen

import socket
import pickle

def get(sock):
    data, addr = sock.recvfrom(1024)
    data = pickle.loads(data)           #to convert data back to a dictionary
    return data, addr

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
data, addr = get(sock)
Unter Mac läuft es immer noch wunderbar. Windows liefert diesen Error:

File "C:\Users...\network.py", line .., in get
data, addr = sock.recvfrom(1024) OSError: [WinError 10022] An invalid argument was supplied


What's the problem?
BlackJack

@Hustensaft: Auf welchem Port werden die Daten denn empfangen? ;-)
Hustensaft
User
Beiträge: 5
Registriert: Donnerstag 2. April 2015, 21:36

Also meines Erachtens nach wird der PORT doch frei gewählt von Python, solange man den Socket nicht binded, oder? Beim Senden benutze ich den PORT 9999.
BlackJack

@Hustensaft: Du sendest an Port 9999 und hoffst das der Empfänger dann zufällig genau auf dem Port was empfängt? Also wenn das so funktionieren würde. Wenn jetzt zwei oder mehr Empfänger einfach lauschen ohne zu sagen auf welchem Port und es kommen Pakete rein, wer empfängt die denn Deiner Vorstellung nach? Und wie sinnvoll und (un)sicher wäre das dann?
Hustensaft
User
Beiträge: 5
Registriert: Donnerstag 2. April 2015, 21:36

Also ist es zum recieven von Paketen zwingend notwendig den Socket zu binden?

Eigentlich geht es um die Kommunikation zwischen einem Server und Klienten. Als erstes sendet der Client ein "Hallo" an den Server. Dieser ist gebildet an eine IP mit PORT. Er empfängt nun die Daten und speichert den User mit einem beliebigen Port, den der Rechner des Klienten nunmal gerade benutzt hat. Der Server antwortet dann auf genau diese Adresse. Müsste dann "recvfrom(1024)" nicht funktionieren? Also besitzt der Client dann nicht einen festen Port?
BlackJack

@Hustensaft: Der Server muss `bind()` verwenden.
Hustensaft
User
Beiträge: 5
Registriert: Donnerstag 2. April 2015, 21:36

Macht er auch, aber muss der Client das auch?
BlackJack

@Hustensaft: AFAIR nein, aber das hättest Du jetzt auch einfach ausprobieren und/oder im Netz nachschlagen können.
Hustensaft
User
Beiträge: 5
Registriert: Donnerstag 2. April 2015, 21:36

Ja, aber dann sind wir wieder am Anfang. Dann taucht der obere Error auf.
BlackJack

@Hustensaft: Nein, denn der Client sendet ja etwas im Gegensatz zu dem Code im ersten Beitrag und durch das senden *vor* dem Empfangen muss ja ein Port ausgesucht werden. Allerdings möchte man eventuell auch beim Client vorher explizit ein `bind()` machen um das Netzwerkinterface bestimmen zu können über den das UDP-Paket rausgeht. Wenn man dabei als Port 0 angibt wird ein freier Port vom System ausgewählt.
Antworten