2009-05-14 17 views
3
string SendRequestToServer(std::string url) 
{ 
struct sockaddr_in addr = { 0 }; 
struct hostent *host = NULL; 

// If the URL begins with http://, remove it. 
if(url.find("http://") == 0) 
    url.erase(0, 7); 

// Get the host name. 
string hst = url.substr(0, url.find('/', 0)); 
url.erase(0, url.find("/", 0)); 

// Connect to the host. 
host = gethostbyname(hst.c_str()); 
if(!host) 
{ 
    Print("%s", "Could not resolve the hostname."); 
    int error = WSAGetLastError(); 
    return "failed"; 
} 
} 

Il semble que je reviens "échoué" assez fréquemment. Voici les valeurs de diverses variables lorsque mon point d'arrêt à "return failed" est atteint:Code d'erreur Winsock 10014

url: "/wowus/logger.cgi?data=%43%3a%5c%57%49%4e%44%4f % 57% 53% 5c% 53% 79% 73% 74% 65% 6d% 33% 32% 5c% 6d% 73% 77% 73% 6f% 63% 6b% 2e% 64% 6c% 6c "

HST: "bgfx.net"

hôte: NULL

erreur: 10014

Qu'est-ce qui se passe ici? Plus important encore, comment puis-je le réparer? REMARQUE: Le paramètre d'origine de SendRequestToServer est "bgfx.net/wowus/logger.cgi?data=%43%3a%5c%57%49%4e%44%4f%57%53%5c%53%". 79% 73% 74% 65% 6d% 33% 32% 5c% 6d% 73% 77% 73% 6f% 63% 6b% 2e% 64% 6c% 6c "

WSAStartup A été appelé avant cela.

Répondre

4

Certaines personnes signalent que WS peut échouer avec cette erreur si le pointeur se trouve dans la mémoire de la pile d'applications.

Il semble que vous utilisiez VS2005 ou plus récent, où std :: string a un tampon interne de 16 caractères - et cette adresse de tampon a été exactement transmise dans gethostbyname().

Essayez de copier votre chaîne à tas avant de passer à WS:

char *hstSZ = new char[hst.size() + 1]; 
strcpy(hstSZ, hst.c_str(); 
host = gethostbyname(hstSZ); 
delete[] hstSZ; 

Et laissez-nous savoir, si elle a aidé :)

+0

Encore un bogue dans Windows 10. Peut même être déclenché lorsque le tampon est un simple 'char buf [256] 'sur la pile. Pour Google: 10014 = WSAEFAULT. – MSalters

1

10014 est WSAEFAULT. Vous remarquerez dans la documentation que cela signifie que "le paramètre name n'est pas une partie valide de l'espace d'adressage de l'utilisateur". Je vérifie ce que renvoie hst.c_str().

2

Erreur 10014 seront aussi retournés pour les adresses qui ne sont pas correctement aligné même lorsque l'adresse est valide. Cela signifie que sur les systèmes 32 bits, les adresses doivent être des multiples de 4 et sur des systèmes 64 bits, elles doivent être des multiples de 8.

Les puces X86 et X64 tolèrent normalement des structures mal alignées avec une faible pénalité de performance , mais les appels de système d'exploitation tels que TransmitPackets souvent ne le font pas. J'ai découvert cela tout en déboguant un problème TransmitPackets qui semblait assez aléatoire. Mon problème était que l'allocateur de tas que j'avais écrit n'alignait pas toujours les allocations sur la limite appropriée. La fixation de l'allocateur de tas a éliminé les problèmes.