🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #13251

Problema de sockets

#13251
From: Cron
Date: Mon, 12 Mar 2001 00:15
127 lines
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-mail

Show 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