Seite 1 von 1
Socket unter Windows erzeugt WinError 10022
Verfasst: Donnerstag 2. April 2015, 21:42
von Hustensaft
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?
Re: Socket unter Windows erzeugt WinError 10022
Verfasst: Donnerstag 2. April 2015, 22:20
von BlackJack
@Hustensaft: Auf welchem Port werden die Daten denn empfangen?

Re: Socket unter Windows erzeugt WinError 10022
Verfasst: Donnerstag 2. April 2015, 22:22
von Hustensaft
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.
Re: Socket unter Windows erzeugt WinError 10022
Verfasst: Donnerstag 2. April 2015, 22:39
von 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?
Re: Socket unter Windows erzeugt WinError 10022
Verfasst: Donnerstag 2. April 2015, 22:40
von Hustensaft
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?
Re: Socket unter Windows erzeugt WinError 10022
Verfasst: Donnerstag 2. April 2015, 23:14
von BlackJack
@Hustensaft: Der Server muss `bind()` verwenden.
Re: Socket unter Windows erzeugt WinError 10022
Verfasst: Donnerstag 2. April 2015, 23:14
von Hustensaft
Macht er auch, aber muss der Client das auch?
Re: Socket unter Windows erzeugt WinError 10022
Verfasst: Donnerstag 2. April 2015, 23:18
von BlackJack
@Hustensaft: AFAIR nein, aber das hättest Du jetzt auch einfach ausprobieren und/oder im Netz nachschlagen können.
Re: Socket unter Windows erzeugt WinError 10022
Verfasst: Donnerstag 2. April 2015, 23:19
von Hustensaft
Ja, aber dann sind wir wieder am Anfang. Dann taucht der obere Error auf.
Re: Socket unter Windows erzeugt WinError 10022
Verfasst: Donnerstag 2. April 2015, 23:24
von 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.