4

recvfromでは、5 番目のパラメーターがsockaddr構造体へのポインターである必要があり、6 番目のパラメーターが へのポインターである必要がありますsocklen_t

man recvfrom (3)言います:

アドレスの実際の長さが指定された sockaddr 構造体の長さよりも大きい場合、格納されたアドレスは切り捨てられます。

AF_INET6 アドレス ファミリを使用して送信ソケットのアドレスを取得する方法がわかりませsockaddr_in6ん。sockaddrrecvfrom

recvfromより大きいアドレスを取得できないというのは正しいsizeof(sockaddr)ですか?

sockaddr_in6キャストのインスタンスを定義してそのアドレスをsockaddr*に渡してもrecvfrom、関数はアドレスを格納するのに十分なスペースがあることを認識できないということを正しく理解していますか?

4

2 に答える 2

8

にキャストするのが正しいsockaddr*です。

さらに、は次のように定義されてsockaddr_storageいるため、人々はよく使用します。

ヘッダーは、sockaddr_storage 構造体を定義します。この構造は次のとおりです。

  • サポートされているすべてのプロトコル固有のアドレス構造に対応するのに十分な大きさ
  • そのポインタをプロトコル固有のアドレス構造へのポインタとしてキャストし、アライメントの問題なしにそれらの構造のフィールドにアクセスするために使用できるように、適切な境界にアライメントされています。

このようにして、複数のプロトコルに使用できるため、IPv6 または IPv4 だけに限定されることはありません。

だからあなたはすることができます

struct sockaddr_storage addr;
socklen_t sa_len = sizeof(addr);

recvfrom (sock, buffer, sizeof (buffer), (struct sockaddr*) &addr, &sa_len);

sockaddr の種類を知る必要がある場合は、sa_family_t ss_family各 sockaddr 構造体に存在する必須フィールドを確認できます。

このリンクまたはこのリンクにも興味があるかもしれませ

于 2013-08-19T06:52:55.467 に答える
7

sockaddr_in6(型キャスト)のポインターとsockaddr_in6構造体のサイズを引数として渡します。

struct sockaddr_in6 in6;
socklen_t len6 = sizeof(in6);

recvfrom(sock, buf, buflen, (struct sockaddr *) &in6, &len6);

関数に正しい長さを渡すので、機能します。

于 2013-08-19T06:49:52.377 に答える