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
....