の差分構造addrinfo、sockaddr、sockaddr_in



Difference Structure Addrinfo



struct sockaddr struct sockaddr_inと、ネットワーク通信アドレスを処理するためのこれら2つの構造体。

A、sockaddr

ヘッダーファイルのsockaddr #include 定義済み、欠陥sockaddr:sa_dataは、次のように、ミックスの宛先アドレスとポート情報です。



  1. struct sockaddr {
  2. sa_family_t sin_family//アドレスファミリ
  3. char sa_data [14]// 14バイト、ソケット内の宛先アドレスとポート情報が含まれます
  4. }

2、sockaddr_in

ヘッダーファイルのsockaddr_in #include or #include 構造体の定義では、sockaddrはストレージポートの欠陥に対処し、addrは次のように2つの変数を分離しました。
sin_port sin_addrであり、ネットワークバイトオーダー(NBO)である必要があります。視覚化された数値は、通常、ホストバイトオーダー(HBO)です。

第三に、要約

同じ長さで16バイトです。つまり、同じメモリ量であれば、相互に変換できます。両方の構造体は並列であり、ポイントsockaddr_in構造体ポインターもsockaddrを指す場合があります。



バインド、接続、recvfrom、sendtoの他の関数に使用されるsockaddrパラメーター、アドレスを示す情報、アドレスはユニバーサルソケットです。
sockaddr_inは、インターネット環境アドレス形式のソケットです。したがって、ネットワークプログラミングでは、最後に使用されたタイプを確立するために必要なsockaddr_in情報を使用して、動作するsockaddr_in構造体を作成します。 最初の一般的なsockaddr_in変数の割り当て後、関数に渡される必須の変換パラメーターはsockaddrを使用しますsockaddr関数パラメーターの定義と割り当てのためのsockaddr_inソケット。

例は次のとおりです。

  1. 含める
  2. 含める
  3. 含める
  4. 含める
  5. intメイン((int argc、char ** argv)
  6. {{
  7. int sockfd
  8. 構造体sockaddr_inmysock
  9. sockfd =ソケット(AF_INET、SOCK_STREAM、0)// fdを取得します
  10. bzero(&mysock、sizeof(mysock))//構造を初期化します
  11. mysock.sin_family = AF_INET//アドレスファミリを設定します
  12. mysock.sin_port = htons(800)//ポートを設定します
  13. mysock.sin_addr.s_addr = inet_addr('192.168.1.0')//アドレスを設定します
  14. bind(sockfd、(struct sockaddr *)&mysock、sizeof(struct sockaddr)/ *変換時にバインド* /
  15. ..。..。
  16. 戻る0
  17. }

ちなみに、2つの関数はhtons()とinet_addr()です。



htons()関数は、ホストによるポート番号の整数値のネットワークバイトオーダーバイトオーダーへの変換です。 ((ネットへのホスト)。

inet_addr()アクションは、整数値のシーケンスへのIPネットワークバイト文字列です。 sockaddr_in.sin_addr.s_addrの場合。

inet_ntoa()関数が構造体に出力されますsin_addrIP文字列(( アスキーへのネットワーク )。といった:

printf('%s',inet_ntoa(mysock.sin_addr))
  • 1

htonl()関数とhtons()は同じですが、32ビット(Long)用であり、htons()は2バイト、16ビット(short)用です。

2つの関数()とhtons()を持つHtonlは、逆の効果です:ntohl()とntohs()。

typedef struct addrinfo {
int ai_flags // AI_PASSIVE、AI_CANONNAME、AI_NUMERICHOST
int ai_family // AF_INET、AF_INET6
int ai_socktype // SOCK_STREAM、SOCK_DGRAM
int ai_protocol // IPPROTO_IP、IPPROTO_IPV4、IPPROTO_IPV6など。
size_t ai_addrlen //ゼロまたはnullポインタである必要があります
char * ai_canonname //ゼロまたはnullポインタである必要があります
struct sockaddr * ai_addr //ゼロまたはnullポインタである必要があります
struct addrinfo * ai_next //ゼロまたはnullポインタである必要があります
}

ここで、ai_flags、ai_family、ai_socktypeは次のとおりです。
パラメータ値値説明
ai_family AF_INET 2 IPv4
AF_INET6 23 IPv6
AF_UNSPEC0プロトコルに依存しない
ai_protocol IPPROTO_IP 0IPプロトコル
IPPROTO_IPV4 4 IPv4
IPPROTO_IPV6 41 IPv6
IPPROTO_UDP 17 UDP
IPPROTO_TCP 6 TCP
ai_socktype SOCK_STREAM1ストリーム
SOCK_DGRAM2データグラム
ai_flags AI_PASSIVE 1バインド用パッシブ、通常はサーバーソケットに使用
AI_CANONNAME 2
AI_NUMERICHOST4はいくつかの文字列に対応します

手順ai_flags値の場合:
AI_NUMERICHOST | AI_CANONNAME | AI_PASSIVE
上に示したように、ai_flagsの値の範囲は0〜7で、プログラムの提供方法に応じて、set ai_flags'AI_PASSIVE | AI_CANONNAME '、ai_flagsの値は3です。意味3つのパラメーターは次のとおりです。
(1)AI_PASSIVEこのフラグが設定されている場合、呼び出し元は、バインドの構造体()関数呼び出しで返されたアドレスを使用します。このフラグが設定されていない場合、connect()関数呼び出しを使用すると表示されます。ノード名声がNULLで、このフラグが設定されている場合、返されるアドレスはワイルドカードアドレスになります。ノード名がNULLで、このフラグが設定されていない場合、アドレスはループバックアドレスを返します。
(2)AI_CANNONAMEこのフラグが設定されている場合、関数の最初の構成のai_cannonameaddrinfoメンバーが戻ります。これにはnullで終了する文字列が含まれている必要があります。文字列の内容はノード名の正式な名前です。
(3)AI_NUMERICHOSTこのフラグが設定されている場合、このフラグは、呼び出しアドレスのノード名が数値文字列でなければならないことを示します。