Exemple 1: serveur avec select

void erreur(char *msg)

{

perror(msg) ;

exit(1) ;

}

int read_from_client (int sock)

{

char buffer[512] ;

int r;

r = read (sock, buffer, 512) ;

if (f< 0) erreur("read") ;

else if (r == 0) return -1 ;

else {

printf ("Le Serveur a recu le message : `%s'\n", buffer) ;

return 0 ;

       }

}

int main ()

{

int sock, i ;

// Déclaration  des ensembles de descripteur

fd_set active_fd_set, read_fd_set ;

struct sockaddr_in clientname, serv_adr ;

+size_t size = sizeof (struct sockaddr_in) ;

sock = socket(AF_INET, SOCK_STREAM, 0) ;

if (sock < 0) erreur("Erreur d'ouverture de la socket") ;

bzero((char *)&serv_adr,sizeof(serv_adr)) ;

serv_adr.sin_family = AF_INET ;

serv_adr.sin_addr.s_addr=htonl(INADDR_ANY) ;

serv_adr.sin_port = htons(5555) ;

if (bind(sock, (struct sockaddr *) &serv_adr, size) < 0) erreur("Erreur attachement socket") ;

if (listen(sock, 5) < 0) erreur("socket") 

// Initialisation

FD_ZERO (&active_fd_set) ;

FD_SET (sock, &active_fd_set) ;

while (1) {

read_fd_set = active_fd_set ;

if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0)  erreur("Select") ;

for (i = 0 ; i < FD_SETSIZE ; ++i)

/*Tester avec si le descripteur est toujours présent dans son ensemble*/

if (FD_ISSET (i, &read_fd_set)) {

 

 

// Demande de connexion sur la socket initiale

if (i == sock) {

int new ;

size = sizeof (clientname) ;

new = accept (sock, (struct sockaddr *) &clientname, &size) ;

if (new < 0) erreur(" accept") ;

printf ( "Serveur : connexion depuis") ;

printf ("%s, adresse :",inet_ntoa (clientname.sin_addr)) ;

/*Insertion  du socket de service new dans l’ensemble active_fd_set*/

FD_SET (new, &active_fd_set) ;

}

/* Arrivee de donnée sur une socket connectée */

else {

if (read_from_client (i) < 0) {

close (i) ;

FD_CLR (i, &active_fd_set) ;

                                         }

}

}

}

 

 

Exemple 2 : Attente de la réponse pendant une seconde.

FD_ZERO(&readSet );

FD_SET(socketDescriptor, &readSet);

timeVal.tv_sec = 1 ;

timeVal.tv_usec = 0;

if (select(FD_SETSIZE, &readSet, NULL, NULL, &timeVal)>0 ) {

memset(msg, 0, sizeof msg); // Mise à zéro du tampon

if (recv(socketDescriptor, msg, sizeof msg, 0) == -1)

{

perror("recv:");

close(socketDescriptor);

exit(EXIT_FAILURE);

}

 

 


Last modified: Saturday, 18 May 2024, 11:05 PM