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

私はかなり頻繁に「失敗」を返しているようです。「returnfailed」のブレークポイントに到達したときのさまざまな変数の値は次のとおりです。

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」

ホスト:NULL

エラー:10014

何が起きてる?さらに重要なのは、どうすれば修正できますか?

注:SendRequestToServerの元のパラメーターは、「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が呼び出されました。

4

3 に答える 3

7

一部の人々は、アプリケーションスタックメモリ内にポインタを取得すると、WSがこのエラーで失敗する可能性があると報告しています。

std :: stringに16文字の長さの内部バッファがあるVS2005以降を使用しているようです。正確には、このバッファアドレスがgethostbyname()に渡されました。

WSに渡す前に、文字列をヒープにコピーしてみてください。

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

そして、それが役に立ったなら、私たちに知らせてください:)

于 2009-05-14T14:16:35.097 に答える
2

アドレスが有効な場合でも適切に位置合わせされていないアドレスについても、エラー10014が返されます。つまり、32ビットシステムでは、アドレスは4の倍数である必要があり、64ビットシステムでは、8の倍数である必要があります。

X86およびX64チップは通常、わずかなパフォーマンスの低下で構造のずれを許容しますが、TransmitPacketsなどのオペレーティングシステムコールは許容しないことがよくあります。

かなりランダムに見えるTransmitPacketsの問題をデバッグしているときにこれを発見しました。私の問題は、私が作成したヒープアロケータが、割り当てを常に適切な境界に揃えるとは限らないことでした。ヒープアロケータを修正すると、問題が解消されました。

于 2009-12-05T00:39:40.217 に答える
1

10014はWSAEFAULTです。ドキュメントから、これは「nameパラメーターはユーザーアドレス空間の有効な部分ではない」という意味であることがわかります。hst.c_str()が何を返しているかを確認します。

于 2009-05-14T07:00:06.050 に答える