Linux Cのsockaddrとsockaddr_inの違い

2107 ワード

Linux Cのsockaddrとsockaddr_inの違い
struct sockaddrとstruct sockaddr_inこの2つの構造体は、ネットワーク通信のアドレスを処理するために使用される.
様々なシステム呼び出しまたは関数では,ネットワークアドレスと付き合う限り,この2つの構造体が用いられる.
ネットワーク内のアドレスには、次の3つの要素があります.
1アドレスタイプ:ipv 4またはipv 6 2 ipアドレス3ポート
対応するヘッダファイルには、次の定義があります.

include  
 
struct sockaddr { 
  unsigned short  sa_family;  // 2 bytes address family, AF_xxx 
  char       sa_data[14];   // 14 bytes of protocol address 
}; 
 
// IPv4 AF_INET sockets: 
 
struct sockaddr_in { 
  short      sin_family;    // 2 bytes e.g. AF_INET, AF_INET6 
  unsigned short  sin_port;  // 2 bytes e.g. htons(3490) 
  struct in_addr  sin_addr;   // 4 bytes see struct in_addr, below 
  char       sin_zero[8];   // 8 bytes zero this if you want to 
}; 
 
struct in_addr { 
  unsigned long s_addr;     // 4 bytes load with inet_pton() 
}; 

注記には、属性の意味とそのバイトサイズが明記されています.この2つの構造体は同じ大きさで、いずれも16バイトで、family属性があります.違いは、次のとおりです.
sockaddrは残りの14バイトでsaを表すdata,sockaddr_in 14バイトをsin_に分割port, sin_addrとsin_zeroはそれぞれポート、ipアドレスを表す.sin_zeroはバイトを埋めてsockaddr_をinはsockaddrと同じ大きさに保たれています.
sockaddrとsockaddr_inに含まれるデータは同じですが、使用には違いがあります.
プログラマーはsockaddrを操作すべきではありません.sockaddrはオペレーティングシステム用です.
プログラマはsockaddrを使用する必要があります.inアドレスを表すsockaddr_inアドレスとポートを区別して使いやすいです. 
一般的な使い方は次のとおりです.
プログラマはタイプ、ipアドレス、ポートをsockaddr_に埋め込むIn構造体を強制的にsockaddrに変換し、パラメータとしてシステム呼び出し関数に渡す
ネットワークプログラミングの典型的なコードは次のとおりです.

int sockfd; 
struct sockaddr_in servaddr; 
 
sockfd = Socket(AF_INET, SOCK_STREAM, 0); 
 
/*   struct sockaddr_in */ 
bzero(&servaddr, sizeof(servaddr)); 
servaddr.sin_family = AF_INET; 
servaddr.sin_port = htons(SERV_PORT); 
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr); 
 
/*      struct sockaddr */ 
connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)); 
  




読書に感謝して、みんなを助けることができることを望んで、みんなの当駅に対する支持に感謝します!