4

私はネットワーク化されたアプリケーションをプログラムしましたが、主に Python でした。

私は C++ アプリケーションを作成していますが、ドメイン名を検索してその IP アドレスに接続するための構文が正確にどうあるべきかについて少し曖昧です。

具体的には、ソケットへの gethostbyname() 呼び出しの結果を形成する方法がわかりません。

私のコードは現在次のようになっています。

const hostent* host = GetHost(); //This works correctly
    if (!host) {
        DebugMessage("Bad host", "Could not resolve host");
        return NULL;
    }
    DebugMessage("Got host", host->h_name);

    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    sockaddr_in addr;
    addr.sin_family = AF_INET;
    //This funky cast is what i'm concerned about
    addr.sin_addr.s_addr = (*((in_addr*)(host->h_addr_list[0]))).s_addr;
    addr.sin_port = htons(80);

    DebugMessage("addr", (*((in_addr*)(host->h_addr_list[0]))).s_addr);

    int c = connect(s, (SOCKADDR*)&addr, sizeof(addr));
    int le = WSAGetLastError();
    if (c == SOCKET_ERROR) {
        //etc...

それは機能しますが、s_addr を割り当てるためのファンキーなキャストは、私が実際に行っていることに対して複雑すぎるように思われるため、これは「行うべき」方法ではないと信じるようになりました。私は高水準言語に慣れすぎていて、これが本来あるべき姿なのか、それともユーティリティ関数がどこかに欠けているのでしょうか?

助けてくれてありがとう。

4

2 に答える 2

1

ドメイン名を解決するための最新かつ推奨される方法は、使用することだと思いますgetaddrinfowindowslinux)。

私の知る限り、ルックアップを非同期で行う標準的な方法はありません。そのため、DNS ルックアップ専用のスレッドを生成するのが一般的です。

于 2011-08-31T20:27:00.000 に答える
1

技術的には、そのタイプに基づいて仮定してから解釈するのh_addrtypeではなく、使用する必要があります。( と の両方で)すでに想定している場合は、それが であると想定することもできます。AAAA レコード (IPv6) を取得した場合にチェックして、誤ってキャストするのではなく拒否することができます。AF_INETh_addr_listAF_INETsocketconnecth_addr_list[0]in_addrh_addrtype

于 2011-08-31T20:08:15.407 に答える