TD4
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);
}