1

IPv4 または IPv6 の文字列表現 (「66.102.1.147」[google] など) をバイナリ ネットワーク バイト順の形式に変換する「inet_pton」という関数を実装しようとしています。私のコードの関連部分は次のとおりです。

#if defined WIN32
int inet_pton (int af, const char *src, void *dst)

{
    const void *data;
    size_t      len;
    struct      addrinfo hints, *res;

    hints.ai_family   = af;
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_UDP;
    hints.ai_flags    = AI_NUMERICHOST;

    if (getaddrinfo (src, NULL, &hints, &res))
    {
        std::cout << "ERROR : inet_pton() in " << __FILE__ << " at line " << __LINE__ << std::endl;
        std::cout << "      : getaddrinfo() failed to get IP address info for \"" << src << "\"" << std::endl;
        return 0;
    }
...

したがって、src は着信 IP 文字列です。ただし、常に次のようなエラーが発生します

getaddrinfo() は「66.102.1.147」の IP アドレス情報を取得できませんでした

Winsock の経験がある人はコメントできますか? 別の方法、関数も試しました

WSAStringToAddress ((LPTSTR)src, af, NULL, (LPSOCKADDR) &sa, &address_length)

ただし、無効な IP 文字列を示すエラー コード WSAEINVAL が常に返されます。これは私には意味がありません。IDE として VS2005 を使用しています。

4

4 に答える 4

4

まず、UDP をプロトコルとして使用するストリーム ソケットを要求しますが、それは実現しません。

試してみてください:

hints.ai_family   = af;
hints.ai_socktype = 0; 
hints.ai_protocol = 0;
hints.ai_flags    = AI_NUMERICHOST;

設定していない余分なメンバーがあるため、最初に memset をゼロに設定します...

また、私のコードでは、ポートまたはサービスがない場合は、null ではなく空の文字列を渡します。ドキュメントには、値がない場合の対処方法が指定されていないようです。いずれにせよ、空の文字列は私にとってはうまくいきます。

ああ、このような状況ではいつものことですが、WSAGetLastError() が返す値を知っておくと便利です...

于 2009-02-13T19:12:04.800 に答える
2

MSDN には、getaddrinfo の使用に関する優れた記事があります。

http://msdn.microsoft.com/en-us/library/ms738520(VS.85).aspx

AI_NUMERICHOST を使用した例もありますが、これは必要なように思えます。彼らはあなたとは少し異なる「ヒント」構造体をセットアップします:

ZeroMemory(&hints, sizeof(hints));
hints.ai_flags = AI_NUMERICHOST;
hints.ai_family = AF_UNSPEC;

他の 2 つのプロパティは設定しません。多分これは助けになるでしょうか?

于 2009-02-13T19:10:49.017 に答える
2

af に渡す値は何ですか? 同じことを行うコードがいくつかありますが、私のものとあなたのものの唯一の違いは次のとおりです。

  • ヒント構造体を 0 に memset します
  • 私はいつもPF_UNSPECai_familyにパスします
  • IPPROTO_TCPではなく使用しますIPPROTO_UDP
于 2009-02-13T19:13:49.650 に答える
1

libcurlを参照として使用することもできます。車輪の再発明は必ずしも必要ではありません。

于 2009-02-13T19:17:51.557 に答える