Bonjour,
Je penche depuis plusieurs heures sur un simple serveur TCP qui reçoit des données d'un client dont certaines sont urgentes. Je souhaite tout simplement traiter différemment les messages selon s'ils sont urgents ou non. Pour cela, j'ai utiliser un handler que j'ai associé au signal SIGURG qui est censé être envoyé lorsque le client envoit des données urgentes. Cependant, la fonction représentant le handler pour les messages urgents n'est jamais appelée ! Tous les messages sont traités de la même manière, urgents ou non ! Où est donc mon erreur ?! Voici mon code :
handler pour les messages urgents :
ici, j'arme le signal SIGURG avec le handler sig_urg
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 void sig_urg(int sig) { int n=1; char buff[2048]; printf ("SIGURG recu \n"); printf("Recepteur: recu signal SIGURG (%d): caractere urgent\n",sig); /* Reception du caractere urgent */ printf ("read %d OOB octets %s\n", n,buff); }
demande au système d'envoyer le signal au proprio de la socket
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 struct sigaction action; action.sa_handler=sig_urg; sigemptyset(&action.sa_mask); action.sa_flags=0; sigaction(SIGURG,&action,NULL);
et enfin, réception des données non urgentes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int rep; if (ioctl(serverSocket, SIOCATMARK, &rep) < 0) { perror("ioctl(SIOCSPGRP)"); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 for (;;) { // Reception des donnees non urgents. Si Fin de connexion ou erreur // sortir du serveur memset((char *)buff,(char)0,2048); // raz buffer if(n=recv(clientSocket,buff,sizeof(buff),0) > 0){ if(write(1,buff,n)!=n) perror("write error"); }else{ if(n<0){ if(errno==EINTR) perror("read error with EINTR"); }else{ if(n==0) exit(0); } } }
Partager