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 :

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);
}
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
 
struct sigaction action;
action.sa_handler=sig_urg;
sigemptyset(&action.sa_mask);
action.sa_flags=0;
 
sigaction(SIGURG,&action,NULL);
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
 
int rep;
if (ioctl(serverSocket, SIOCATMARK, &rep) < 0) {
	perror("ioctl(SIOCSPGRP)");
}
et enfin, réception des données non urgentes

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