c++windowswinsockwsastartup

Winsock error code 10014


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

It seems I'm returning "failed" quite frequently. Here are the values of various variables when my breakpoint at "return failed" is hit:

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"

host: NULL

error: 10014

What's going on here? More importantly, how can I fix it?

NOTE: The original parameter to SendRequestToServer is "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 HAS been called before this.


Solution

  • Some people report that WS can fail with this error if got pointer inside application stack memory.

    It looks like you are using VS2005 or newer where std::string has internal 16 chars long buffer - and exactly this buffer address was passed into gethostbyname().

    Try to copy your string to heap before passing it to WS:

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

    And let us know, if it helped :)