UDP winsock2 : Select problem

UDP winsock2 : Select problem - C++ - Programmation

Marsh Posté le 24-03-2006 à 18:26:22    

Salut,
 
Je dois réaliser un client/server UDP avec attente de message non bloquante.
 
Tout se passait bien jusqu'à l'utilisation de Select().
 
Si je lance, le code suivant, le premier Select retourne 0 pour indiquer que la socket n'a pas recu de paquet.
Le deuxième retourne -1 pour indiquer que la socket a été fermé....
 
Si je ne mets pas de Select(), c'est à dire que le recvfrom est bloquant, et à ce moment là, la socket fonctionne et je peux envoyer et recevoir les messages.
Comme si le select avait fermé volontairement la socket.
 
WSADATA wsa;
WSAStartup(MAKEWORD(2,0),&wsa);
 
SOCKET sockReceive, sockSend;
SOCKADDR_IN sinReceive,sinSend;
 
fd_set m_Sockets;
FD_ZERO(&m_Sockets);

 
sinReceive.sin_family=AF_INET;
sinReceive.sin_addr.s_addr=INADDR_ANY;
sinReceive.sin_port=htons(port);
sinSend.sin_family=AF_INET;
sinSend.sin_addr.s_addr=inet_addr("172.17.96.51" );
sinSend.sin_port=htons(33334);
 
sockReceive=socket(AF_INET,SOCK_DGRAM,0);
sockSend=socket(AF_INET,SOCK_DGRAM,0);
FD_SET(sockReceive, &m_Sockets);
bind(sockReceive,(SOCKADDR*)&sinReceive,sizeof(sinReceive));
 
char buffer[50];
int sinsize=sizeof(33333);
 
timeval waiting = {20,0};
int res;
while(1)
{
res=select(FD_SETSIZE, &m_Sockets, NULL, NULL, &waiting);
if(res>0)
{
memset(buffer,0,sizeof(buffer));
recvfrom(sockReceive,buffer,sizeof(buffer),0,(SOCKADDR*)&sinReceive,&sinsize);
printf("Recu : %s\n",buffer);
sprintf (buffer, "172.17.96.51:33334", buffer);
sendto(sockSend,buffer,sizeof(buffer),0,(SOCKADDR*)&sinSend,sizeof(sinSend));
printf("Envoye : %s\n",buffer);
 
}
if(res<0)
{
printf("Socket error\n" );
}
else if(res==0)
{
printf("Temps attente passé\n" );
}
Sleep(100);
}
}
 
Console d'execution :
Port : 33333
Temps attente passé
Socket error
Socket error
Socket error
Socket error
Socket error
Socket error
....

Reply

Marsh Posté le 24-03-2006 à 18:26:22   

Reply

Marsh Posté le 24-03-2006 à 22:40:30    

En fait, il faut réinitialiser le fd_set après chaque select()
FD_ZERO(&m_Sockets);  
FD_SET(sockReceive, &m_Sockets);

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed