8

sockaddr と sockaddr_storage の違いは何ですか? コードを見るとまったく同じに見えるので、わかりません:

struct sockaddr {
    uint8_t sa_len;
    sa_family_t sa_family;
    char sa_data[14];
}

struct sockaddr_storage {
    uint8_t ss_len;
    sa_family_t ss_family;
    char ss_padding[SIZE];
}
4

1 に答える 1

13

バリアントは「storage可能な最大サイズと同じ大きさ」であることを意図しており、適切に配置されています (したがって、IPv6 アドレス、IPv4 アドレス、ISO プロトコル アドレス、さらにはAF_UNIXパス名などを保持できます)。ソケットアドレスの種類に関係なく、「任意のソケットアドレス」を保持するのに十分な大きさのビン/バレル/ブレッドボックス/(他のお気に入りのストレージアイテム) と考えてください。IPv4 アドレス ( struct sockaddr_in) は小さく、IPv6 アドレスを保持できないことは明らかですが、struct sockaddr_storageには大きな貨物領域があります。

オリジナルstruct sockaddrはおそらくこれほど大きいはずでしたが、そうではありませんでした。したがって、これは基本的に履歴エラーの回避策です。

(あなたが上で引用したバージョンには、疑わしいと思われるアライメント項目が含まれていません。)

于 2013-10-22T21:55:24.367 に答える