多分あなたの側からの誤解があるでしょう。について話す:
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
src_addr
聞きたいアドレスを渡すために使用されるのではなく、配布された実際の送信元アドレスを取得するために提供されたストレージの場所です。
したがってsrc_addr
、アドレスにまったく関心がないために NULL に設定しても、いずれにしても使用されないので気にする必要はありませaddrlen
ん。
一方、送信元アドレスについて通知を受けたい場合は、保存場所を提供するだけでなく、提供した保存場所の大きさも伝える必要があります。*addr_len
そのため、割り当てたバッファ サイズに初期化する必要があります。
呼び出し後、 が指す値はaddrlen
、送信元アドレスを格納するために割り当てたスペースのうち、実際にデータで満たされた量 (ある場合) を通知します。
サイズについて
struct sockaddr とサイズの受け渡しに関する全体的な問題は、それらがネットワーク ソケットで最も頻繁に使用されているにもかかわらず、はるかに一般的な概念であることを意図していたという事実に関係しています。
ファイルシステムを介して実装される UNIX ドメイン ソケットを例として考えてみてください。IP ベースのネットワークで知られているものとはまったく異なるアドレス指定スキームが必要です。ここで使用される sockaddr のタイプは次のとおりです。
struct sockaddr_un {
sa_family_t sun_family; /* AF_UNIX */
sun_path[UNIX_PATH_MAX]; /* pathname */
};
これを IP ベースのネットワーキングで使用される構造体と比較してください。
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
両方に共通点があまりないことは明らかです。
ソケットは両方のケースに適合するように設計されています。