Bonjour,
Après une journée de recherches, je ne suis pas parvenu à identifier clairement mon problème, j'ai donc décider de poster.
J'utilise depuis longtemps déjà une fonction permettant d'obtenir son IP internet (vu que je passe par un routeur, l'ip locale ne suffit pas). Cette fonction m'a été donnée par yoyo.
Voici le code:
#include <winsock2.h>
char * IP_Internet()
{
SOCKET W_IP;
IN_ADDR Adresse;
SOCKADDR_IN SockAddrIn;
HOSTENT * Hote;
WSADATA WSAData;
char Buffer[1024];
static char IP[16];
WSAStartup(0x0202, &WSAData);
W_IP = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
Hote = gethostbyname("siteayoyo.free.fr");
memcpy(&Adresse, Hote -> h_addr, Hote -> h_length);
SockAddrIn.sin_family = AF_INET;
SockAddrIn.sin_port = htons(80);
SockAddrIn.sin_addr = Adresse;
connect(W_IP, (SOCKADDR *)&SockAddrIn, sizeof(SockAddrIn));
strcpy(Buffer, "GET http://siteayoyo.free.fr/ip.php HTTP/1.0\n\n"); // la requete http
send(W_IP, Buffer, strlen(Buffer), 0);
recv(W_IP, Buffer, sizeof(Buffer), 0);
closesocket(W_IP);
WSACleanup();
strcpy(IP, Extraire_IP(Buffer));
return IP;
}
En fait c'est un request sur une page ou est affichée l'ip du visiteur. Ensuite je récupère la page j'extrait l'ip et je la renvoie!
Cette fonction me convenait parfaitement jusque là, le problème est que dans de très rares cas la fonction bloque le thread! Je teste systématiquement qu'une connexion est bien établie avant de m'en servir. Ce petit soucis pose un gros problème de stabilité à mon application.
Deux solutions me conviendraient:
Soit on configure le socket de manière à ce qu'il renvoie un bon gros message d'erreur, dans ce cas il me suffirait de relancer la fonction si l'erreur est renvoyée. (elle ne peut pas planter deux fois de suite, c'est de l'ordre d'une fois sur 100 voir moin encore)
Soit on remplace carrément cette fonction, ce qui ne me dérange pas en soit mais il me faut absolument quelque chose de stable :)
Enfin ce ne sont que des suggestions, je laisse les conaisseurs répondre car ca fesait un bon moment que j'avais plus toucher à ce cher winsock2...
Merci d'avance pour vos réponces.