Discussion:
Problemas con memoria compartida
(demasiado antiguo para responder)
Jacobo de Vera
2005-01-04 11:26:17 UTC
Permalink
Hola,

Estoy haciendo uso de memoria compartida en una aplicación que no sé si
es válida porque, de hecho, no me da los resultados esperados.
Haciendo un servidor de chat, cada conexión de un cliente es atendida por
us proceso hijo del servidor. Este proceso hijo recibe el nick con el que
se conecta el cliente y lo añade a una lista que debe estar disponible
para sus procesos hermanos, pues todo lo que reciban debe ser enviado a
todos los clientes conectados.
Mi idea era crear una lista enlazada con los sockets y los nicks usando
memoria compartida, de modo que siempre estuviese actualizada en todos
los procesos. Pero no funciona.

La estructura de la lista es esta:

struct clientData {
int socket;
char nick[15];
struct clientData *next;
};

struct clientData* clientList;

Inicializo la lista haciendo clientList = NULL;

Y lo que hago para añadir un nuevo usuario a la lista es esto:

void addClient(int sock, char *nick)
{
struct clientData *cl;
char mens[TAMAX];
int smid;
/* Reserva de memoria compartida para nuevo nodo */
smid=shmget(ftok(".", 'F'), sizeof(struct clientData), IPC_CREAT|
0600));
cl=(struct clientData *)shmat(smid,0,0);
/* carga de datos en el nodo creado */
cl->next = clientList;
cl->socket = sock;
strcpy( cl->nick, nick );
clientList = cl;
}


El problema es que cuando salgo de la función addClient, si intento
recorrer la lista mostrando los nicks o los sockets, sólo veo caracteres
ascii arbitrarios que nada tienen que ver con lo que he guardado en la
lista.
¿Sabe alguien qué estoy haciendo mal?

Gracias de antemano por vuestra ayuda.
heltena
2005-01-04 16:56:05 UTC
Permalink
Post by Jacobo de Vera
Hola,
Estoy haciendo uso de memoria compartida en una aplicación que no sé si
es válida porque, de hecho, no me da los resultados esperados.
Haciendo un servidor de chat, cada conexión de un cliente es atendida por
us proceso hijo del servidor. Este proceso hijo recibe el nick con el que
se conecta el cliente y lo añade a una lista que debe estar disponible
para sus procesos hermanos, pues todo lo que reciban debe ser enviado a
todos los clientes conectados.
Mi idea era crear una lista enlazada con los sockets y los nicks usando
memoria compartida, de modo que siempre estuviese actualizada en todos
los procesos. Pero no funciona.
Supongo que usaras un fork para crear los hijos de ahí que necesites la
memoria compartida. ¿Has pensado la posibilidad de usar posix threads y
así no tener este problema?

Referido a tu problema, no sé cómo funciona la memoria compartida, así
que por este lado poco te puedo ayudar.

Otra será que en vez de preguntar aquí vayas a un grupo de programacion
en unix, por ejemplo es.comp.os.linux.programacion (lo que tienes no es un
problema de C).

Saludos!

Loading...