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')に設定します。そうしないと、構造体に予期しないジャンク値が含まれる可能性があります。