Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

21

22.12.2007, 21:32

C-/C++-Quelltext

1
unsigned int ret = select (...);


... was ist daran wohl falsch? ;)

Wenn jetzt das select eine -1 liefert, wird daraus ein 2^32-1 und das ist DEUTLICH größer als 1.

Wenn aber select einen Fehler gemeldet hat, werden auch die fd_sets nicht modifiziert und m_acceptSocket bleibt drin stehen, obwohl dort keine Daten anliegen.

Ergo: accept wird aufgerufen und blockiert logischerweise.

Bei mir gibt's einen select Fehler, weil der Client die Verbindung sofort nach dem Connect wieder schließt. Damit ist in der Liste ein ungültiger Socket, und select meckert.

Achso, die Auflösung ist natürlich:

C-/C++-Quelltext

1
int ret = select (...);
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

22

22.12.2007, 23:27

Mom, imo ist ein Socket unter Windows ein unsigned int und für Fehler gibt es den INVALID_SOCKET Wert. Nur bei Linux (oder UNIX?) ist das ein int mit -1 als Fehlercode.
Unter Windows wird auch statt unsigned int SOCKET verwendet, was meiner Meinung nach extrem intelligenter ist als unsigned int oder int. Wenn man das ganze unter Linux kompiliert schreibt man einfach nur typpedef int SOCKET und kann wie gewohnt weitermachen.
Lieber dumm fragen, als dumm bleiben!

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

23

23.12.2007, 00:57

Der Ergebnistyp der select Funktion ist sowohl unter Windows als auch unter UNIX ein int. Das ist auch gut so, weil Windows versucht bei den "kleingeschrieben" Funktionen der Winsock2 Implementation möglichst dicht am UNIX zu bleiben.

SOCKET_ERROR ist unter Windows einfach nur ein

C-/C++-Quelltext

1
#define SOCKET_ERROR -1


Das hat also alles mit dem Datentyp, der für ein Socket verwendet wird, herzlich wenig zu tun. :roll:

edit: Das Biest heißt natürlich SOCKET_ERROR und nicht INVALID_SOCKET. Den gibt's zwar auch, und als int interpretiert wäre es auch -1, aber "::select" gibt ja keinen Socket als Ergebnis zurück. Da hab ich mich aufs Glatteis führen lassen, sorry.
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

24

23.12.2007, 10:22

Wenn ich in Codeblocks mit MinGW als Compiler bei SOCKET auf "Find declaration" klicke, finde ich in der winsock2.h:

C-/C++-Quelltext

1
typedef u_int   SOCKET;

Sieht für mich relativ Vorzeichenlos aus (Ja u_int ist als unsigned int deklariert und nciht als signed int). Und es deckt sich auch mit dem, was ich im Internet bisher über Sockets unter Windows gelesen habe.
Mag sein, dass Microsoft mal wieder was geändert hat, ob meine Version jetzt neuer oder älter ist weiß ich nicht, aber ich habe eine ziemlich aktuelle MinGW Version.
Deshalb macht es ja auch Sinn SOCKET statt u_int oder int zu benutzen. Dann kann es dir nämlich scheiß egal sein.
Lieber dumm fragen, als dumm bleiben!

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

25

23.12.2007, 11:08

Schau nochmal genau hin: es geht um den Ergebnistyp der "::select" Funktion und nicht um den Datentyp, der für ein Socket benutzt wird.
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

26

23.12.2007, 18:09

hmm... also das könnte ein ziemlich guter grund sein..

die funktion liefert nun auch einen richtigen error code.. nämlich -1..
ist zwar nicht das was ich will, aber immerhin :D

nun ja.. wie gesagt funktioniert das ganze noch immer nicht wie es soll..

mein client den ich da hab, der funktioniert.. mit einem server ohne select kann ich den ganz normal verwenden.. es muss also am select-server liegen.. aus irgendeinem grund geht die verbindung gleich nachdem sie aufgebaut wurde wieder verloren.. aber ich weiss nicht warum..

die verbindung wird definitiv hergestellt..
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

27

23.12.2007, 18:51

Also ich hatte das Problem, dass ich die Clients immer mit einem Connection timeout rausgeflogen sind. Daher läuft das mit dem Accept bei mir in einem anderen Thread.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

28

23.12.2007, 19:48

an multithreading hab ich auch schon gedacht, aber select() soll die gebräuchlichere variante sein...
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

29

23.12.2007, 19:53

Zitat von »"$nooc"«

select() soll die gebräuchlichere variante sein...

Das sagt noch lange nichts darüber aus, was besser ist.
Signaturen werden überbewertet

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

30

23.12.2007, 20:05

ich hab auch nie etwas darüber gesagt welche der beiden methoden besser ist..

aber wenn das schon im raum steht: ich finde die select() methode besser, da mir dann die arbeit mit einem weiteren thread erspart bleibt.. aber das ist ja jedem selbst überlassen ^^

viel mehr würde mich interessieren wieso mein server die verbindung mit dem client wieder beendet..

EDIT:

nachdem eine verbindung angenommen wurde, liefert select() plötzlich nur mehr INVALID_SOCKET (-1) ..

der error den mir select() liefert ist folgender:

Zitat von »"MSDN"«


WSAENOTSOCK
10038

Socket operation on nonsocket.
An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.


aber ich arbeite NUR mit sockets.. kenn nichtmal was anderes.. wie soll das gehn?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Werbeanzeige