2012-05-10 20 views
5

Come uno dei assigments dobbiamo implementare molto semplice server in C con alcuni clienti. L'idea è che l'utilizzo del sistema code V IPC creiamo una coda dove i clienti si registrano e poi per ogni cliente c'è una coda con i messaggi. Mi sto chiedendo un po 'sulla parte server. Dovrei avere qualcosa di simile:Molto semplice server in C

while(1) 
{ 
    //some queue using code 
    sleep(100); 
} 

così per ogni intervallo di tempo verifico ogni coda e fare quello che devo fare, o forse dovrei usare i segnali per informare del server che almeno una delle code è pronto a essere gestito

come si fa nei server normali, cosa hanno certo intervallo di tempo dopo il quale essi controllare tutto ciò di cui hanno bisogno per fare o non c'è modo più corretto di fare questo?

+8

Il tipico codice di rete in C viene in genere eseguito con qualcosa come ['select()'] (http://stackoverflow.com/questions/4171270/select-function-in-socket-programming), che è basato sugli eventi . Ecco una buona guida (almeno quando l'ho usato): http://beej.us/guide/bgnet/ – birryree

+0

Vuol select() funzioni lavorano con id di code System V? – Andna

+1

io non sono sicuro di questo (non ho toccato la roba System V in probabilmente 7 anni), ma una parte della guida che ho linkato sopra anche illustrato l'utilizzo di sistema v code: http://beej.us/guide /bgipc/output/html/multipage/mq.html Anche se credo che nel tuo caso, quello che si potrebbe fare è di avere i client si connettono e selezionate da loro presa/descrittori, e gestire una coda per loro (invece di 'select()' - in coda). – birryree

risposta

3

Devi fare qualcosa sulla falsariga di questo:

Questa è una risposta molto semplice, e ha bisogno di definizioni e prototipi per essere in atto, tuttavia, che dovrebbe dare una base di selezione, ad esempio.

questo codice funziona sia su FreeBSD, ubuntu, e il computer le mie finestre (Data di avere le intestazioni corrette) anche il suo stato minimizzato e alcune definizioni rimosso, succhiare come defs descrittore del socket perché quelli sono più o meno - è quello che è .

struct timeval timeout; 
int rc 
fd_set wfdset,rfdset,errfdset; 
//Do some checks put them in either read fdset or write fdset or error fdset 
FD_SET (socket_sd, &rfdset); 
timeout.tv_sec = 0; 
timeout.tv_usec = 250 * 1000; 
rc = select (maxfds + 1, &rfdset, &wfdset, NULL, &timeout); 
//loop through the sockets and read from them at this point. 

Select è portatile per Win32 e UNIX, anche se non è la scelta consigliata se si sta facendo qualsiasi sollevamento di carichi pesanti sui socket in UNIX IE: FreeBSD. usa kqueue o epoll o simili se hai bisogno di approfondire e avere una maggiore gestione delle tue prese.

Problemi correlati