1
std::cout << WebClient().Load(in.substr(2, in.length()));

私は楽しみのために WebClient を作成しました。 std::getline(cin, in); を介して cin から in に文字列を渡すことができます。

私の Load メソッドの開始部分:

std::string Load(std::string url)
{
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
        return "WSAStartup failed.\n";
    }
    SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    struct hostent *host;
    host = gethostbyname(url.c_str());
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port=htons(80);
    SockAddr.sin_family=AF_INET;
    if(host != nullptr)
    {
        SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
    }

ホストがnullptrになるため(したがってチェックするため)、アクセス違反が発生しますが、同じ文字列が異なる方法で渡されます: WebClient().Load("www.google.ca") 動作します。そして、substr'ed文字列の最後に c_str() を入れてみましたが、役に立ちませんでした。

私はまだ癖を学んでいますが、これはどうですか? の標準ライブラリを使用しています

#include <http.h>
#include <string>
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
4

2 に答える 2

2

渡された文字列の値が from として受け取ったものを確認してみてくださいgetlinegethostbyname受信時に不正な形式である可能性があります。を使用して、これが失敗している (そして NULL になっている) かどうかを確認できますWSAGetLastErrorgethostbyname考えられるエラー コードについては、MSDN を確認してください。

編集:あなたは一見同一のパラメータを持っていると言います。これを(自分自身に)証明する方法を見つけることができますか?そこに見えないキャラクターが入ったのかもしれませんか?新しい行\n、またはおそらく別のエンコーディングを使用していますか? ほんのいくつかのアイデア。

于 2013-03-12T05:07:34.397 に答える
1

答えとして私のコメントを書く:あなたは余分な文字、空白さえあるかどうかを見ることができる方法でURLを印刷するべきです。次に、使用するすべての関数のエラーコードを確認する必要があります。たとえば、 throughのドキュメントを読んでください。gethostbyname以下の関数のデバッグバージョンであり、ここで説明されているエラーコードが必要です。

#include <cstring>

std::string Load(std::string url)
{
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
        return "WSAStartup failed.\n";
    }
    SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    struct hostent *host;
    std::cout << "Getting hostname for url as seen by gethostbyname: '" << url.c_str() << "', strlen=" << strlen(url.c_str()) << std::endl;
    host = gethostbyname(url.c_str());
    if (host) {
        std::cout << "got valid hostent as response" << std::endl;
    } else {
        std::cout << "gethostbyname WSAGetLastError=" << WSAGetLastError() << std::endl;
        return "Invalid url.\n";
    }
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port=htons(80);
    SockAddr.sin_family=AF_INET;
    if(host != nullptr)
    {
        SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
    }

理由の推測:からのURLにcinは空白が含まれています。

用語に関する注意:そのアドレス文字列は、実際にはurlではありません。urlhttp://は最初のようなスキームを持っている必要があります。あなたが持っているのは、ホストの完全修飾ドメイン名ですが、それもそうであるはずですが、gethostbynameURLを理解していません。

于 2013-03-12T07:05:24.673 に答える