3

多かれ少なかれ、タイトルに書かれていること。次のように getaddrinfo を呼び出しています。

struct addrinfo crossplat, *actual_addr;
crossplat.ai_family = AF_UNSPEC; //IPv4 or IPv6.
crossplat.ai_socktype = SOCK_STREAM; 

if(int i = getaddrinfo("localhost", "8000", &crossplat, &actual_addr)!=0){
    cerr << "error code " << i << " received. Meaning: "<<  gai_strerror(i) << endl;
    return -1;
}

誇らしげに印刷します:

error code 1 received. Meaning: Unknown error

私のシステムで。

私のシステムの getaddrinfo man ページ:

RETURN VALUE
   getaddrinfo() returns 0 if it succeeds, or one of the following 
   nonzero error codes:

   EAI_ADDRFAMILY....


   ...The gai_strerror() function translates these error codes to a 
       human readable string, suitable for error reporting.

これは、getaddrinfo によって返されるすべてのゼロ以外のコードが、リストされている EAI_* ファミリ コードの 1 つである必要があることを示唆しています。オンラインで検索すると、gai_strerror() は、EAI_* ファミリーのメンバーではないエラー コードが渡された場合にのみ「不明なエラー」を返すことが示唆されています。

どうやら私はここで何か間違ったことをしているようですので、どんな支援も大歓迎です!

4

3 に答える 3

7

この式は C の構文エラーですが、C++ を使用していると仮定すると、期待どおりにグループ化されていません。

if (int i = getaddrinfo("localhost", "8000", &crossplat, &actual_addr)!=0){

これは常に 0 または 1 であるgetaddrinfo("localhost", "8000", &crossplat, &actual_addr) != 0toの結果を代入します。igetaddrinfo()i

i割り当てを括弧で囲むことができるように、以前に宣言する必要があります。

int i;
if ((i = getaddrinfo("localhost", "8000", &crossplat, &actual_addr)) != 0) {

getaddrinfo()(もちろん、これを行った後は、呼び出しを の初期化子に移動することもあるでしょうi)。

于 2012-11-15T11:14:30.483 に答える
2

初期化する必要があると思いますcrossplat.ai_protocolヒント引数のマニュアル ページセクションには、既に初期化したメンバーに加えて、これが使用されていることが記載されています。addrinfo

を初期化する必要がある場合もありますcrossplat.ai_flags。構造全体を memset する方がおそらく簡単でしょう。

struct addrinfo crossplat, *actual_addr;
memset(&crossplat, 0, sizeof(crossplat));
crossplat.ai_family = AF_UNSPEC; //IPv4 or IPv6.
crossplat.ai_socktype = SOCK_STREAM;
于 2012-11-15T10:53:34.727 に答える
1

In getaddrinfo.h: #define EAI_ADDRFAMILY 1、つまり : ホスト名のアドレス ファミリはサポートされていません

于 2012-11-15T10:55:29.673 に答える