Newsgroup: it.comp.os.linux.iniziare
Titolo: 2 cliente ed 1 server

Con una socket, ho un server e due client. I client vengono gestiti da
processi figli mentre il padre resta in attesa sulla socket.
Come faccio a far dialogare i 2 client? In pratica il server delle leggere
dalla socket di uno e scrivere su quella dell'altro.
Come recupero le info sulle socket dei due client su cui deve scrivere il
padre?
So che è una stupidata ma non ci riesco. Grazie
Grazie


Forse andava su development :P
Comunque devi tenere traccia degli indirizzi ai quali sono connessi i 
client, salvandoli in una qualche lista tipo (utente, socket).
Puoi salvarti il socket che viene restituito dalla chiamata accept.
Dopodiche', puoi risalire al socket di ogni utente tramite le tue 
strutture dati (tipo se usi classi o record) e usarlo nella chiamata SendTo

 strutture dati (tipo se usi classi o record) e usarlo nella chiamata
SendTo
Quindi quello che mi restiuisce la accept č la socket dell'utente specifico.
Io avevo capito che ad ogni accept il server con la fork crea un nuova
socket per parlare con il client specifico ed č su quello che bisogna
scrivere.
Vabbuň, non ho capito un granchč. Grazie cmq.
P.S.: Sto usando C quindi niente classi.

 Vabbuň, non ho capito un granchč. Grazie cmq.
Magari ora un po' di piu' :P

 > Vabbuò, non ho capito un granchè. Grazie cmq.


 valore?
Non e' che chiudi la connessione dopo averla ricevuta ?
Se e' cosi', e' possibile che il sistema riutilizzi sempre lo stesso valore.

"{MSX}" <hotmail.com@msx_80> ha scritto nel messaggio
news:0kfQb.178467$_P.62...@news4.tin.it...

No. Ecco il codice del server. Questo si limita a rimandare ad ogni client
quelle che scrive.
Ma se collego piů client il numero socket stampato č sempre lo stesso.
Hai suggerimenti su come far parlare due client?
GRAZIE :)))
#include <sys/types.h>  /* predefined types */
#include <unistd.h>     /* include unix standard library */
#include <arpa/inet.h>  /* IP addresses conversion utilities*/
#include <sys/socket.h> /* socket library */
#include <stdio.h>      /* include standard I/O library */
#include <string.h>
#include <errno.h>
# define MAXLINE 80
# define BACKLOG 10
void ServEcho ( int sockfd );
//void PrintErr ( char * error );
ssize_t FullRead (int fd , void * buf , size_t count );
ssize_t FullWrite (int fd , const void * buf , size_t count );
int main (int argc , char * argv [])
{
   int list_fd , conn_fd ;
   pid_t pid;
   struct sockaddr_in serv_add ;
   /* create socket */
   if ( ( list_fd = socket ( AF_INET , SOCK_STREAM , 0)) < 0)
   {
      perror (" Socket   creation   error ");
      exit (1);
   }
   /* initialize address and bind socket */
   memset (( void *)& serv_add , 0 , sizeof ( serv_add )); /* clear server
address */
   serv_add.sin_family = AF_INET ; /* address type is INET */
   serv_add.sin_port = htons (3490); /* echo port is 3490 */
   serv_add.sin_addr.s_addr = htonl ( INADDR_ANY ); /* connect from anywhere
*/
   if ( bind ( list_fd , ( struct sockaddr *)& serv_add , sizeof (
serv_add )) < 0)
   {
      perror (" bind   error ");
      exit (1);
   }
   /* main body */
   if ( listen ( list_fd , BACKLOG ) < 0 )
   { /* listen on socket */
     perror("ErroreListen");
     exit (1);
   }
   while (1)
   { /* handle echo to client */
     if ( ( conn_fd = accept ( list_fd , NULL , NULL )) < 0)     <------ 
conn_fd č la socket del client?
     {
        perror("Errore Accept");
        exit (1);
     }
     if ( ( pid = fork ()) < 0 )
     {  /* fork to handle connection */
        perror("Errore fork");
        exit (1);
     }
     if ( pid == 0)
     {  /* child */
        close ( list_fd ); /* close listening socket */
        ServEcho ( conn_fd ); /* handle echo */
        exit (0);
     } else { /* parent */
            close ( conn_fd ); /* close connected socket */
            }
   }
   exit (0); /* normal exit , never reached */
}
void ServEcho ( int sockfd )
{
  char buffer [ MAXLINE ];
  int nread , nwrite ;
  char debug [ MAXLINE+20];
  /* main loop , reading 0 char means client close connection */
  while ( ( nread = read (sockfd , buffer , MAXLINE )) != 0)
  {
     printf("--> Client %d : %s",sockfd,buffer);    <------ qui non dovrebbe
stampare la socket dello specifico client?
     nwrite = FullWrite (sockfd , buffer , nread );
     if ( nwrite )
     {
         perror("Error write");
     }
  }
  return ;
}
ssize_t FullRead (int fd , void * buf , size_t count )
{
  size_t nleft ;
  ssize_t nread ;
  nleft = count ;
  while ( nleft > 0)
  { /* repeat until no left */
    if ( ( nread = read (fd , buf , nleft )) < 0)
    {
      if ( errno == EINTR )
      { /* if interrupted by system call */
        continue ; /* repeat the loop */
      } else {
           return ( nread ); /* otherwise exit */
        }
    } else if ( nread == 0)
           { /* EOF */
              break ; /* break loop here */
           }
    nleft -= nread ; /* set left to read */
    buf += nread ; /* set pointer */
  }
  return ( nleft );
}
ssize_t FullWrite (int fd , const void * buf , size_t count )
{
  size_t nleft ;
  ssize_t nwritten ;
  nleft = count ;
  while ( nleft > 0)
  { /* repeat until no left */
    if ( ( nwritten = write (fd , buf , nleft )) < 0)
    {
      if ( errno == EINTR )
      { /* if interrupted by system call */
         continue ; /* repeat the loop */
      } else {
              return ( nwritten ); /* otherwise exit with error */
             }
      }
    nleft -= nwritten ; /* set left to write */
    buf += nwritten ; /* set pointer */
  }
  return ( nleft );
}

    exit (0); /* normal exit , never reached */
Umm prova a togliere i due close e a lasciare il resto uguale. se fai 
close ( conn_fd ) e' probabile che chiudi la connessione del client.
Il close ( list_fd ) non so bene a che serva li ma io non l'ho mai usato..

"{MSX}" <hotmail.com@msx_80> ha scritto nel messaggio
news:jXsQb.138203$VW.55...@news3.tin.it...

Scusam ma non sono daccordo.
Il close(conn_fd) che vedi è nel processo padre ed è corretto. IL padre
resta solo in attesa sulla socket iniziale per gestire le richieste di
collegamento. Il figlio invece non chiude nulla e continua a lavorare sulla
socket con il client.
Ti trovi?

"Ciobin" <lin...@FORZA-FERRARI-libero.it> ha scritto nel messaggio
news:CMtQb.275536$vO5.11...@twister1.libero.it...

Avevi ragione tu !!!!
Ora alcuni altri problemucci. Potrei scriverti in privato, altrimenti qui
diventa un thread da paura?
Quando ho finito sarà mio impegno postare la chat completa sul NG.
Spero, tu abbia la voglia e la pazienza di aiutarmi :-))))))

 Spero, tu abbia la voglia e la pazienza di aiutarmi :-))))))
Nessun problema
Ciao!

"{MSX}" <hotmail.com@msx_80> ha scritto nel messaggio
news:ZVMQb.141869$VW.57...@news3.tin.it...

GRAZIE :-)))))