Article View: es.comp.os.linux.programacion
Article #13251Problema de sockets
From: Cron
Date: Mon, 12 Mar 2001 00:15
Date: Mon, 12 Mar 2001 00:15
127 lines
3728 bytes
3728 bytes
En primer lugar gracias a todos los que me ayudaron en mi anterior mensaje.
Pues bien, estoy realizando un servidor en C para Linux. Detallo el c�digo
que tengo hecho hasta ahora:
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#define MAXUSERS 100
#define IP "127.0.0.1"
#define PORT 4000
struct info
{
int nsfd;
char nombre[13];
};
struct info *usuario;
main()
{
int sfd, nsfd, pid;
struct sockaddr_in ser_addr, cli_addr;
int cli_addr_len;
char *buf;
int shmid;
key_t llave;
int i;
if ((llave = ftok ("auxiliar", 'K')) == (key_t)-1)
{
perror ("Error ftok");
exit (-1);
}
if ((shmid = shmget (llave, MAXUSERS * sizeof (struct info), IPC_CREAT |
0600)) == -1)
{
perror ("Error shmget");
exit (-1);
}
usuario = shmat (shmid, 0, 0);
for (i = 0; i<MAXUSERS; i++)
usuario[i].nsfd = -1;
if ((sfd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
{
perror ("Error socket");
exit (-1);
}
ser_addr.sin_family = AF_INET;
ser_addr.sin_addr.s_addr = inet_addr (IP);
ser_addr.sin_port = htons (PORT);
if (bind (sfd, &ser_addr, sizeof (ser_addr)) == -1)
{
perror ("Error bind");
exit (-1);
}
listen (sfd, 5);
while (1)
{
cli_addr_len = sizeof(cli_addr);
if ((nsfd = accept (sfd, &cli_addr, &cli_addr_len)) == -1)
{
perror ("Error accept");
exit (-1);
}
if ((pid = fork ()) == -1)
perror ("Error fork");
else if (pid == 0)
{
close (sfd);
/* C�digo del proceso hijo. */
i = 0;
while (usuario[i].nsfd != -1)
i++;
usuario[i].nsfd = nsfd;
recv (nsfd, buf, 1000, 0);
strcpy (usuario[i].nombre, buf);
strcpy (buf, "Bienvenido\n\n");
send (nsfd, buf, strlen (buf), 0);
while (1)
{
recv (nsfd, buf, 1000, 0);
i = 0;
while (i < MAXUSERS)
{
if (usuario[i].nsfd != -1){
send (usuario[i].nsfd, buf, strlen (buf), 0);
}
i++;
}
}
close (nsfd);
exit(0);
}
}
}
Funciona de la siguiente manera: cuando se conecta un cliente (p.e. un
Telnet), el servidor le envia un mensaje de bienvenida, y el usuario escribe
su nombre. El servidor guarda el nombre y su descriptor de socket en la
memoria compartida. A partir de ese momento los clientes envian sus
mensajes.
El problema es que: se conecta el cliente 1, despu�s se conecta el cliente
2. El cliente 2 envia un mensaje y le llega bien al cliente 1, pero si el
cliente 1 envia un mensaje no le llega al cliente 2. Si se conecta un
cliente 3, cuando envia un mensaje le llega al 2 y al 1, si el 2 envia un
mensaje solo le llega al 1 (no al 3) y el cliente1 sigue sin poder enviar
mensajes.
�que pasa? �es posible que sea problema de la memoria compartida? una ayuda
por favor.
Saludos cordiales
Technical Details
Message-ID:
<98h49d$neg$1@diana.bcn.ttd.net>Path:
arc1-ca.pugleaf.net!supernews.google.com!sn-xit-03!supernews.com!nntp.cs.ubc.ca!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeed.cwix.com!newsfeed.bcn.ttd.net!news.bcn.ttd.net!not-for-mailShow Full Headers
Complete Article Headers
X-Google-Language: ENGLISH,ASCII X-Google-Thread: f86c8,1e9b2d04f4f0632,start X-Google-Attributes: gidf86c8,public X-Google-ArrivalTime: 2001-03-11 16:19:15 PST Path: arc1-ca.pugleaf.net!supernews.google.com!sn-xit-03!supernews.com!nntp.cs.ubc.ca!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeed.cwix.com!newsfeed.bcn.ttd.net!news.bcn.ttd.net!not-for-mail From: "Cron" <cron@cron.com> Newsgroups: es.comp.os.linux.programacion Subject: Problema de sockets Date: Mon, 12 Mar 2001 01:15:33 +0100 Organization: Telefonica Transmision de Datos Lines: 129 Message-ID: <98h49d$neg$1@diana.bcn.ttd.net> NNTP-Posting-Host: 213-99-149-133.uc.nombres.ttd.es X-Newsreader: Microsoft Outlook Express 4.72.3110.5 X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3