Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
03.12.2002, 15:39
[HUI]-Tiger-



Huhu !

Habe folgendes Prob:
Ich möchte in einer Serverschleife überprüfen, ob ein neuer Client connecten will. Wenn ich in die schleife ein sccept setze, dann geht das ja nicht wegen blocking call. Bin bei der Forensuche auf diesen thread gestoßen:
http://www.thewall.de/forum/showtopic.php?threadid=24428
Nun geht das bei mir aber irgendwie nicht :(

das sieht bei mir ca. so aus:
Quellcode:
SOCKET acceptSocket = Server.StartSocket(); //Socket starten
...
bind(acceptSocket, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN));
...
listen(acceptSocket, 5);

soo das funktioniert auch alles, denn wenn ich den server starte und keine Clients connected sind, führe ich einfach accept aus, denn da ist ja der blocking call möglich. Sobald ein Client connectet, geht dann die "Serverschleife" los.

Quellcode:
connectedSocket = accept(SServer.acc, NULL, NULL);
...//client in liste aufnehmen
Server.ServerComm(); //Meine Schleife

jetzt wollte ich gerne in der Schleife überprüfen, ob ein neuer Client connected, und zwar so:

Quellcode:
...
FD_ZERO(&readfs);
FD_SET(0,&readfs);
FD_SET(acceptSocket, &readfs);

select(acc, &readfs, NULL, NULL, NULL);
if(FD_ISSET(acceptSocket, &readfs))printf("Accept Socket Traffic !\n");
...

so, geht aber leider nicht. Schätze mal ich hab wieder irgendwo nen riesen Denkfehler drin, also bitte sagt mir, wo er ist ;(
Kann ich acceptSocket etwa nicht mehr nehmen wenn ich den schon einmal mit accept() verwendet hab ? oder is was mit dem FD_SET falsch oder dem select() ? tja bin sicher mir kleinen n00b könnt ihr das sagen.

--

.-.-.-.
cya Tiger

zum Seitenanfang zum Seitenende Profil || Suche
001
03.12.2002, 17:30
Prefect



Ich nehme mal an, "geht aber leider nicht" bedeutet, daß der Debugstring nie ausgegeben wird.

Kehrt select() denn überhaupt zurück oder hängt das Programm in select() ewig? Je nachdem würde ich als erstes mal den Rückgabewert von select() überprüfen.

Als nächstes stellt sich die Frage, was "acc" ist. Normalerweise muß acc der Wert der höchsten Socketnummer plus eins sein (in deinem Fall acceptSocket + 1).

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
002
03.12.2002, 17:45
[HUI]-Tiger-



sry, das acc sollte acceptSocket heissen. Ich hab den Code geändert, dass es besser verständlich ist.

select funzt immer. Warum muss da die "+1" dazu ?
bis jetzt hatte ich die Client-Verbindung (connectedSocket) überprüft und danach (hab auch davor getestet) acceptSocket.
Komischerweise reagiert AcceptSocket auch bei connectedSocket, und sobald ich mit einem 2. Client connecte, steht im Clientprogramm "connection accepted" und der acceptSocket beim Chatserver reagiert darauf aber nicht.. :(

--

.-.-.-.
cya Tiger


Dieser Beitrag wurde am 03.12.2002 um 17:57 von [HUI]-Tiger- bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
04.12.2002, 14:48
Prefect



Unter Unix (die Windows-Variante ist ja nur Imitation, bin mir nicht sicher ob das da auch noch alles stimmt) ist fdset ein Bitfeld. FDs (Filedescriptors) sind ja einfach Zahlen, aufsteigend von 0 bis FD_MAX-1 oder so. Nun kann man in einem fdset jedem FD ein Bit zuordnen. Ist dieses Bit gesetzt, dann ist dieser FD im Set enthalten, wenn nicht dann eben nicht.

Der erste Parameter für select() ist die Anzahl von Bits im fdset, die auf gültige Werte gesetzt sind. Der Kernel muß also nur die ersten n Bits im fdsets überprüfen.
Wenn du nun z.B. die FDs 1, 6 und 10 gesetzt hast, dann enthalten die Bits 0 bis 10 gültige Werte. Das sind also insgesamt 11 Bits, die der Kernel berücksichtigen muß: 10+1.

---
Vielleicht ist es so, daß die Netzwerkimplementation des Betriebssystems ein SYN+ACK (also Connection Accepted) an den Client zurücksendet, bevor du in deinem Programm accept() aufgerufen hast. Das ist natürlich... irreführend, wirkt sich aber wahrscheinlich positiv auf die Gesamtlatency aus.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
004
04.12.2002, 15:28
[HUI]-Tiger-



thx für die genaue erklärung, Prefect, ich habs verstanden mit dem +1 :]]
naja ich schätze ich probier noch n bisschen rum, ich dachte nur jemand hätte diesen "Fehler" auch mal gehabt, aber so sitze ich jetzt schon 3 tage an diesem problem. Auf jeden Fall Danke für die Antworten.

--

.-.-.-.
cya Tiger

zum Seitenanfang zum Seitenende Profil || Suche