Gå til innhold

Fjerne list() blocken på socketprogrammering


Anbefalte innlegg

Hallo

Jeg driver og lærer meg socket programmering og har nettopp lært meg listen(). Som de fleste sikkert vet er at den blocker, og at programmer låser seg helt til den mottar !"pakke". Det jeg vil gjøre er å unngå denne blokken. Jeg ser at Winsock har noe som Asynchronous Sockets, men det ser litt plattformavhengig ut, noe jeg gjerne vil unngå. Er det noen som har tips&tricks til dette?

 

Takker på forhånd

Lenke til kommentar
Videoannonse
Annonse

Det kan se ut som at select() er det du er ute etter:

http://beej.us/guide/bgnet/output/html/adv...d.html#blocking

 

«Generally speaking, however, this type of polling is a bad idea. If you put your program in a busy-wait looking for data on the socket, you'll suck up CPU time like it was going out of style. A more elegant solution for checking to see if there's data waiting to be read comes in the following section on select().»

 

Mvh. Ståle

Endret av zirener
Lenke til kommentar

edit: zirener og jeg postet samtidig; select() går også ann å bruke, men tråder er i noen tilfeller enklere synes jeg.

 

Her synes jeg det er lettest (men ikke altid like optimalt da) å bruke tråder. Her er et kjappt eksempel på hvordan man kan sette opp en trådklasse i C++:

 

http://nostdal.org/~lars/programming/c/remote-ffi/thread.hpp

http://nostdal.org/~lars/programming/c/remote-ffi/thread.cpp

 

Denne klassen bruker pthreads, som altså er platformuavhengig basert på det at pthreads er portet til Win32.

 

På serveren kjører listen i en egen tråd som oppretter nye tråder for hver nye innkommende forbindelse - main-tråden og/eller applikasjons/sesjons-trådene dine blir på dette viset ledig. Jeg snakker litt om resten av det å kommunisere asynkront her http://nostdal.org/~lars/articles/async.xhtml ; om det er noe du ikke forstår er det bare å spørre.

 

Man bruker preprocessoren og wrappere for å gjøre ting portabelt. #ifdef o.s.v.; jeg gjør dette her:

http://nostdal.org/~lars/programming/c/oxymora/oxymora/util/

http://nostdal.org/~lars/programming/c/oxymora/oxymora/com/

 

For eksempel vil det under Win32 være nødvendig å passe på at socket-APIet er initialisert, man kan sjekke og gjøre dette i konstruktøren for socket-klassen mens man i konstruktøren for samme klasse under Linux ikke gjør noen ting.

 

#ifdef win32

#include "win32/socket.hpp"

#else defined(linux)

#include "linux/socket.hpp"

#endif

 

..ellernoeslikt - det samme for `socket.cpp'-fila; eventuelt bruke denne teknikken i selve .cpp-fila om du mener forskjellene er minimale og det er unødvendig å måtte ha to separate filer for noe som er såpass likt..

 

Det finnes også et par ferdig-biblioteker for slike ting om du ikke ønsker å sette opp noe selv - kommer på et ganske stort et med navn `ace'. Boost inneholder også ting for threading, og også sockets. Tror ikke sockets helt er en offesiell del av Boost ennå, og jeg har ikke tittet på dem (har de async-støtte?); noen rett meg om jeg tar feil her. Dog er det altså ikke så mye som skal til for å lage en tynn wrapper rundt bsd-sockets (*nix) og Win32-sockets (Windows).

Endret av lnostdal
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...