5

www.google.com のような文字列を取り込んで IP アドレスを返す簡単なプログラムを作成しようとしています...

私がこれまでに持っているもの:

char* hostname = new char[www.size()+1];
std::copy(www.begin(), www.end(), hostname);
hostname[www.size()] = '\0';

struct addrinfo new_addr, *res;

getaddrinfo(www.c_str(), SERVICE.c_str(), &new_addr, &res);



cout << new_addr.ai_addr;

4 番目のパラメーターの 3 番目は何をすることになっていますか? getaddrinfo 関数は new_addr 構造を変更しますか、それとも何を変更しますか? msdn のドキュメントがよくわかりません。ホスト名が解決されたら、それにソケットを接続したいと思います。

4

2 に答える 2

2

3 番目のパラメーターを無効のままにしておくとどうなりますか?

これまでに開発したコードを次に示します。

    char* hostname = new char[www.size()+1];
copy(www.begin(), www.end(), hostname);
hostname[www.size()] = '\0';

struct addrinfo *res;
struct in_addr addr;

getaddrinfo(hostname, NULL, 0, &res);

addr.S_un = ((struct sockaddr_in *)(res->ai_addr))->sin_addr.S_un;

server.sin_addr.s_addr = inet_addr(inet_ntoa(addr));
server.sin_port = htons(portno);

freeaddrinfo(res);
delete []hostname;

server.sin は、ソケット クラスの別のメソッドでソケットを埋めるために使用する他の場所で宣言されています。

于 2013-03-29T07:58:58.213 に答える
1

MSDN のドキュメントは非常に詳細で、さまざまなパラメーターの目的を正確に説明しています。3 番目のパラメーターでは、ルックアップの結果で使用されるソケットのタイプを指定できます。これにより、必要に応じて結果が最適化されます。4 番目のパラメーターは、実際の結果を返します。ドキュメントには、関数の使用方法の完全な例も含まれています。では、ドキュメントの内容が不明確な例は何ですか?

これを試して:

struct addrinfo hints = {0};
hints.ai_flags = 0;
hints.ai_family = AF_UNSPEC; // IPv4 and IPv6 allowed
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;

struct addrinfo *res = NULL;

if (getaddrinfo(www.c_str(), SERVICE.c_str(), &hints, &res) == 0)
{
    TCHAR szIPAddr[64];
    DWORD szIPAddrLen;
    SOCKET skt;

    struct addrinfo *addr = res;
    do
    {
        skt = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
        if (skt == INVALID_SOCKET)
            cout << "Unable to create socket, error " << WSAGetLastError() << endl;
        else
        {
            szIPAddrLen = 64;
            WSAAddressToString(addr->ai_addr, addr->ai_addrlen, NULL, szIPAddr, &szIPAddrLen);

            cout << "Connecting to " << szIPAddr << " ..." << endl;

            if (connect(skt, addr->ai_addr, addr->ai_addrlen) == 0)
            {
                cout << "Connected!" << endl;
                break;
            }

            cout << "Unable to connect, error " << WSAGetLastError() << endl;
            closesocket(skt);
            skt = INVALID_SOCKET;
        }

        addr = addr->ai_next;
    }
    while (addr);

    freeaddrinfo(res);

    if (skt != INVALID_SOCKET)
    {
        // use skt as needed...
        closesocket(skt);
    }
}
于 2013-03-29T00:44:12.210 に答える