Autor Thema: Linuxsockets  (Gelesen 3650 mal)

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« am: 20. June 2005, 14:26 »
Sodelle,

Da bin ich wieder. Nachdem die Sache mit SDL nicht so richtig funktioniert, auch, weils unter Win verdammt zu compilern is usw, hab ich mich jetzt entschlossen, direkt die Linux-Sockets (auf denen mein Server laufen soll) zu benutzen. Funktioniert alles wunderbar, das einzige Problem (kein programmiererisches), dass ich habe liegt diesmal WEDER in der Sprache C an sich *hust* NOCH an den funktionen, sondern vielmehr an den informationen. soweit ich aus allen tuts gesehen habe, kann man mit "accept" schön so lange den betrieb blockieren, bis man einen request reinbekommt, und dann bekommt man socket und so weiter. passt mir natürlich nicht, weils absolut unpassend ist, wenn leute zum beispiel in einem chat mit reden so lange warten müssen, bis ein neuer teilnehmer kommt, weil dann für einen satz die verbindung wieder frei ist. (ist doch klar ;) ) gibt also noch 2 möglichkeiten, die auch ausscheiden. die erste ist die sache mit chieldprozessen zu machen, allerdings ist das dann nicht sehr gut zu koordinieren, und wenns über das chatten hinausgeht, wo noch viel mehr berechnet werden soll, dann wirds sehr schwer... letzte möglichkeit ist, ständig einen anderen task auf dem server zu erstellen, der auf den server connected und disconnected, allerdings is das ja auch net so das wahre, erstmal wegen der kapazität und dann würde ja auch niemand mehr durchkommen.

deswegen jetzt zu meiner frage: gibt es einen befehl, der schaut, ob eine verbindungsanfrage auf accept da ist, oder nicht? ich habe einige tuts durchforstet und auch google und co angestrengt, aber leider gabs da nix ansprechendes, wohl auch, weil es dafür schlecht nen suchbegriff zu finden gibt...

vielen dank an all die freaks (oder einfach nur linux[user/coder]), die mir helfen können,

J!N
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #1 am: 20. June 2005, 14:49 »
Weiß nit ob es das auch unter Linux gibt, aber unter Windows gibt es die Funktion select() die deine gewünschte Aufgabe erledigt.
----------------------
Redakteur bei LowLevel

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 20. June 2005, 14:53 »
und soweit ich das damals aus den tuts gelesen hab (is bissel her) funktioniert das ding unter unix sogar genauso wie unter win ;)
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #3 am: 20. June 2005, 14:54 »
Dann werd ich mal googlen gehen nach der Funktion. Vielen Dank dafür...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 20. June 2005, 15:58 »
Unter UNIX ist select() sogar noch mächtiger als unter Windows, da man so alle Filedescriptoren überprüfen kann.

Beispielcode:
#include <sys/types.h>
#include <sys/stat.h>

// auf manchen systemen braucht man select.h

timeval timeout;
fd_set set;

// timeout auf 0 um nicht zu blockieren
timeout.tv_sec = 0;
timeout.tv_usec = 0;

// fd_set leeren
FD_ZERO( &set );

// alle descriptoren hinzufügen
FD_SET( STDIN_FILENO, &set );

// select ausführen
// 1. parameter = höchster filedescriptor + 1
// 2. parameter = fd_set für read
// 3. parameter = fd_set für write
// 4. parameter = fd_set für error
// 5. parameter = timeout

select( STDIN_FILENO + 1, &set, 0, 0, timeout );

// überprüfen ob daten verfügbar sind:
if( FD_ISSET( STDIN_FILENO, &set ) ) {
//daten lesen
}


Das timeout und das fdset sollte vor jedem select neu gesetzt werden, da es von der implementierung überschrieben werden kann.

Wenn eine Verbindung ankommt, kannst du das überprüfen, indem du mit select() überprüfst, ob auf einem socket daten zum lesen verfügbar sind.

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 20. June 2005, 16:05 »
Kann gut sein, dass es unter Windows auch so funktioniert. Soweit ich weiß, benutzen sowohl Windows (ab NT oder spätestens 2000) genauso wie Linux die FreeBSD-Sockets.

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #6 am: 20. June 2005, 16:24 »
Danke nochmals. Werde mal nach dem Syntax googlen, das in der Schule hat nix zu Tage gebracht... Aber Danke nochmal!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #7 am: 20. June 2005, 16:31 »
Oder aber du stellst den Socket auf non blocking i/o um, das sollte auch accept betreffen, das funktioniert aber nicht einheitlich für windows und linux, oder aber du machst nen seperaten accept thread usw.
*post*

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 20. June 2005, 16:55 »
Non-Blocking IO ist aber schlechter als select(), da man sonst auf alles Sockets lesen muss, wogegen man bei select() nur von den Sockets ließt, wo auch tatsächlich Daten zur Verfügung stehen.
Eigene Threads oder Prozesse sind warscheinlich für deine Anwendung die beste Möglichkeit, die sind jedoch nicht portabel und schwerer zu handhaben.

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #9 am: 20. June 2005, 18:14 »
Wobei, wenn man einen Chatserver mit 1000 Benutzern haben will, will man wohl kaum 1001 Threads laufen lassen ... bei solchen bestehenden Verbindungen wird man wohl evtl. keine Threads benutzen. Die sind dafür bei z.b Webservern (unter Last) absolut notwendig.
*post*

Golum

  • Beiträge: 96
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 20. June 2005, 18:30 »
http://www.ecst.csuchico.edu/~beej/guide/net/

Da wird ziemlich alles standartmäßige erklärt. Ist finde ich großartig geschrieben. :)

[EDIT]
Wenn du dann noch fragen hast ich bin fast immer über ICQ zu erreichen ^^

 

Einloggen