Zic0 Skrevet 7. august 2006 Del Skrevet 7. august 2006 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
Dead_Rabbit Skrevet 7. august 2006 Del Skrevet 7. august 2006 (endret) 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 7. august 2006 av zirener Lenke til kommentar
lnostdal Skrevet 7. august 2006 Del Skrevet 7. august 2006 (endret) 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 7. august 2006 av lnostdal Lenke til kommentar
Zic0 Skrevet 7. august 2006 Forfatter Del Skrevet 7. august 2006 http://norskwebforum.no/pastebin/4515 Det er koden jeg har hittil. Skjønner ikke hvordan jeg skal implementere select() funksjonen, siden Beej's guide er litt anereledes bygd enn min (pluss at den ikke går gjennom compileren min) Noen tips? Lenke til kommentar
lnostdal Skrevet 7. august 2006 Del Skrevet 7. august 2006 Ja, Beej har mest fokus på BSD-sockets (*nix), så det er sikkert noen subtile forskjeller. Sjekk MSDN for detaljer: http://msdn.microsoft.com/library/default....ck/select_2.asp Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå