私は現在、sockaddr
のようなネットワーク構造を使用するCライブラリを作成しています。 私のコードでは、このような構造のサイズを推論するためにこの3値条件を使用しています。struct sockaddr、本当にaddrlenを与える必要がありますか
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
これは、アドレス長addrlen
の明示的な宣言を含む:
addrlen = sourceaddr->sa_family ==
AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6);
しかしながら、そのようなbind
などの標準的なUNIX機能のほとんどは、署名のこの種を持っています。
私の質問は:sa_family
で推測できるのなら、なぜ私の図書館の住所の明示的な表示が必要なのですか?
int bind(int sockfd, const struct sockaddr *addr);
を、内部で使用します:
例えば、バインド・コールは、このシグネチャに変更することができます
__bind(sockfd, addr,
addr->sa_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6));
はありがとうございました間のAPIの履歴をソケットにリンクされている
下位互換性。あなたが 'bind'関数のシグネチャを変更した場合、あなたはもはやPOSIXに準拠していません(そのために努力している)か、他の' bind'関数と互換です。 –
以前のsockaddr構造にsa_familyフィールドがなかったことを意味しますか?では、最近の図書館のアドバイスは何ですか?アドレナンを使うのか使わないのですか?ありがとうございました :) –