2012-05-10 15 views
5

Como una de las asignaciones tenemos que implementar un servidor muy simple en C con algunos clientes. La idea es que al usar las colas IPC del sistema V creamos una cola donde los clientes se registran y luego para cada cliente hay una cola con mensajes. Me pregunto un poco sobre la parte del servidor. Debería tener algo como esto:Servidor muy simple en C

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

por lo que para cada intervalo de tiempo puedo comprobar cada cola y hacer lo que tengo que hacer, o tal vez debería usar señales para informar del servidor que al menos una de las colas está listo para ser administrado.

¿Cómo se hace en los servidores normales, tienen algún intervalo de tiempo después del cual verifican todo lo que necesitan hacer o hay una forma más adecuada de hacerlo?

+8

El código de red típico en C generalmente se hace con algo como ['select()'] (http://stackoverflow.com/questions/4171270/select-function-in-socket-programming), que está basado en eventos . Aquí hay una guía bastante buena (al menos cuando la usé): http://beej.us/guide/bgnet/ – birryree

+0

¿Funcionan las funciones select() con id's de colas System V? – Andna

+1

No estoy seguro de eso (no he tocado las cosas del Sistema V en probablemente 7 años), pero parte de la guía que he vinculado anteriormente también analiza el uso de las colas del sistema V: http://beej.us/guide /bgipc/output/html/multipage/mq.html Aunque creo que en su caso, lo que haría es hacer que los clientes se conecten y seleccionen en sus socket/descriptores, y administrar una cola para ellos (en lugar de 'select()' - ing en la cola). – birryree

Respuesta

3

que tiene que hacer algo en la línea de lo siguiente:

Ésta es una respuesta muy básica, y las necesidades de las definiciones y prototipos a estar en su lugar, sin embargo, que debería darle un básico de selección, ejemplo.

este código funciona tanto en freebsd, ubuntu, y mi computadora con Windows (Dado que tiene los encabezados correctos) También se ha minimizado y se han eliminado algunas definiciones, apesta como el descriptor de socket defs porque son más o menos - es lo que es .

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 es portátil para Win32, así como UNIX, aunque no es la opción recomendada si usted está haciendo cualquier trabajo pesado en sockets UNIX en IE: FreeBSD. use kqueue o epoll o similar si necesita profundizar y tener una mayor administración de sus sockets.