Unixソケット-構造

Unixソケットプログラミングでは、アドレスとポートに関する情報、およびその他の情報を保持するためにさまざまな構造が使用されます。ほとんどのソケット関数は、引数としてソケットアドレス構造へのポインタを必要とします。この章で定義されている構造は、インターネットプロトコルファミリに関連しています。

sockaddr

最初の構造は、ソケット情報を保持するsockaddrです-

struct sockaddr {
   unsigned short   sa_family;
   char             sa_data[14];
};

これは一般的なソケットアドレス構造であり、ほとんどのソケット関数呼び出しで渡されます。次の表に、メンバーフィールドの説明を示します-

属性 説明
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

住所ファミリを表します。ほとんどのインターネットベースのアプリケーションでは、AF_INETを使用しています。
sa_data プロトコル固有のアドレス 14バイトのプロトコル固有のアドレスの内容は、アドレスのタイプに従って解釈されます。インターネットファミリの場合、ポート番号IPアドレスを使用します。これは、以下に定義するsockaddr_in構造で表されます。

のsockaddr

ソケットの要素を参照するのに役立つ2番目の構造は次のとおりです。

struct sockaddr_in {
   short int            sin_family;
   unsigned short int   sin_port;
   struct in_addr       sin_addr;
   unsigned char        sin_zero[8];
};

メンバーフィールドの説明は次のとおりです-

属性 説明
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

住所ファミリを表します。ほとんどのインターネットベースのアプリケーションでは、AF_INETを使用しています。
sin_port サービスポート ネットワークバイトオーダーの16ビットポート番号。
sin_addr IPアドレス ネットワークバイトオーダーの32ビットIPアドレス。
sin_zero 使用されていない これは使用されていないため、この値をNULLに設定するだけです。

アドレスで

この構造体は、上記の構造体でのみ構造体フィールドとして使用され、32ビットのnetid / hostidを保持します。

struct in_addr {
   unsigned long s_addr;
};

メンバーフィールドの説明は次のとおりです-

属性 説明
s_addr サービスポート ネットワークバイトオーダーの32ビットIPアドレス。

ホスティング

この構造は、ホストに関連する情報を保持するために使用されます。

struct hostent {
   char *h_name; 
   char **h_aliases; 
   int h_addrtype;  
   int h_length;    
   char **h_addr_list
	
#define h_addr  h_addr_list[0]
};

メンバーフィールドの説明は次のとおりです-

属性 説明
h_name ti.comなど ホストの正式名称です。たとえば、tutorialspoint.com、google.comなどです。
h_aliases TI ホスト名エイリアスのリストを保持します。
h_addrtype AF_INET アドレスファミリが含まれており、インターネットベースのアプリケーションの場合は常にAF_INETになります。
h_length 4 IPアドレスの長さ(インターネットアドレスの場合は4)を保持します。
h_addr_list in_addr インターネットアドレスの場合、ポインタの配列h_addr_list [0]、h_addr_list [1]などは、構造体in_addrへのポイントです。

NOTE − h_addrは、下位互換性を維持するためにh_addr_list [0]として定義されています。

サーバント

この特定の構造は、サービスおよび関連するポートに関連する情報を保持するために使用されます。

struct servent {
   char  *s_name; 
   char  **s_aliases; 
   int   s_port;  
   char  *s_proto;
};

メンバーフィールドの説明は次のとおりです-

属性 説明
s_name http これはサービスの正式名称です。たとえば、SMTP、FTPPOP3など。
s_aliases エイリアス サービスエイリアスのリストを保持します。ほとんどの場合、これはNULLに設定されます。
スポーツ 80 ポート番号が関連付けられます。たとえば、HTTPの場合、これは80になります。
s_proto

TCP

UDP

使用するプロトコルに設定されます。インターネットサービスは、TCPまたはUDPのいずれかを使用して提供されます。

ソケット構造に関するヒント

ソケットアドレス構造は、すべてのネットワークプログラムの不可欠な部分です。それらを割り当て、入力し、さまざまなソケット関数へのポインターを渡します。これらの構造体の1つへのポインターをソケット関数に渡して、内容を入力することがあります。

これらの構造体は常に参照によって渡され(つまり、構造体自体ではなく、構造体へのポインターが渡されます)、構造体のサイズは常に別の引数として渡されます。

ソケット関数が構造体を埋めるとき、長さも参照によって渡されるため、その値は関数によって更新できます。これらを値結果引数と呼びます。

常に、bzero()関数にmemset()を使用して、構造体変数をNULL(つまり、 '\ 0')に設定します。そうしないと、構造体に予期しないジャンク値が含まれる可能性があります。