2017-01-24 9 views
0

私は現在、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の履歴をソケットにリンクされている

+0

下位互換性。あなたが 'bind'関数のシグネチャを変更した場合、あなたはもはやPOSIXに準拠していません(そのために努力している)か、他の' bind'関数と互換です。 –

+0

以前のsockaddr構造にsa_familyフィールドがなかったことを意味しますか?では、最近の図書館のアドバイスは何ですか?アドレナンを使うのか使わないのですか?ありがとうございました :) –

答えて

0

異なるオペレーティングシステム。各システムには独自のソケット実装があり、そのようなAPIは標準化されていませんでした。

のsocklen_t でいるsockaddrのサイズのために奇妙のtypedefは(受け入れている)、getpeername()、および(接続)。

このtypedefの理由はBSDで、それらの機能が のint *を取り、彼らは 、そのような引数は(潜在的に)別のサイズ、 の整数を指すようにすることを決めたとき、POSIXの人々はそれをすべて台無しということです新しいtypedefの下で。

関連する問題