0

関数のラッパーを作成していgethostbyname()ます。これは、構造体へのポインターを返す前に、返された IPv6 構造体をhostent実行getaddrinfo()し、最終的に IPv4 構造体にマッピングできるようにする必要があります。ただし、返さin_addrれた構造を適切にキャストしてアドレスを入力することに問題がh_addr_listあります-もちろんhostent、ファミリが equals を識別した場合に備えて。AF_INET

私は基本的に次のことを行っています。

strcpy(&s[0],name);
hp->h_name = strdup(s);
hp->h_addrtype = AF_INET;
hp->h_length = sizeof(struct in_addr);
struct sockaddr *sa= res->ai_addr;

// Segmentation fault:
memcpy(hp->h_addr_list[0], &(((struct sockaddr_in *)sa)->sin_addr.s_addr), hp->h_length);

ヒントはありますか?私は長い間 C コードを書いていないので、ばかげた質問をしていたら申し訳ありません。ありがとう。

4

2 に答える 2

1

s_addrメンバ (例)saddr->sin_addr.s_addrはポインタではありません。ポインターにするには、アドレス演算子を使用する必要があります。

And hp->h_addr_list[0] ポインターであるため、ここで address-of 演算子を使用すると、そのポインターのアドレスが取得され、完全に間違ったアドレスにコピーされます。

于 2013-10-10T10:34:29.720 に答える