Linux

  
でのソケットプログラミング

ネットワークソケットデータ転送は特殊なタイプの入出力であり、ソケットはファイル記述子でもあります。 Socketにはオープンファイルと同様にSocket()という関数もあり、この関数は整数のSocketディスクリプタを返し、その後の接続確立、データ転送などの操作はSocketを介して実行されます。

SocketインターフェースとはSocketインターフェースはTCP /IPネットワーク用のAPIで、プログラマーがTCP /IPネットワーク上でアプリケーションを開発するために使用できる多数の機能またはルーチンを定義します。インターネット上でTCP /IPネットワークプログラミングを学ぶためには、Socketインターフェースを理解しなければなりません。 Socketインターフェース設計者は最初にそのインターフェースをUnix オペレーティングシステム
に入れました。 Unixシステムの入出力を理解していれば、Socketを理解するのは簡単です。ネットワークのSocketデータ伝送は特殊なタイプのI /Oであり、Socketもファイル記述子です。 Socketには、ファイルを開くのと同じようにSocket()という関数もあり、この関数は整数のSocket記述子を返し、その後の接続確立、データ転送などの操作はSocketを介して実装されます。一般的に使用される2つのソケットタイプがあります。ストリーミングソケット(SOCK_STREAM)とデータグラムソケット(SOCK_DGRAM)です。ストリーミングはコネクション型TCPサービスアプリケーション用のコネクション型Socketで、Datagram Socketはコネクションレス型UDPサービスアプリケーションに対応するコネクションレス型ソケットです。

Socket Build Socketを作成するために、プログラムはファイル記述子に似たハンドルを返すSocket関数を呼び出すことができます。 int socket(int domain、int type、int protocol); domainは使用するプロトコルファミリを指定します。通常はインターネットプロトコルファミリ(TCP /IPプロトコルファミリ)を表すPF_INET; typeパラメータはソケットのタイプを指定します。あるいは、SOCK_DGRAMでは、Socketインターフェースは、プログラムが下位層プロトコルを使用することを可能にする、元のSocket(SOCK_RAW)も定義し、プロトコルは通常「0」が割り当てられる。 Socket()呼び出しは、後で呼び出しで使用できる整数のソケット記述子を返します。ソケット記述子は、記述子テーブルエントリを指す内部データ構造へのポインタです。 Socket関数が呼び出されると、ソケット実行可能ファイルはSocketを作成します実際には、「Building a Socket」はSocketデータ構造用の記憶領域を割り当てることを意味します。 Socket Executorはあなたのための記述子テーブルを管理します。 2つのネットワークプログラム間のネットワーク接続には、通信プロトコル、ローカルプロトコルアドレス、ローカルホストポート、リモートホストアドレス、およびリモートプロトコルポートの5種類の情報が含まれています。これら5種類の情報はSocketデータ構造に含まれています。

ソケットの設定ソケット呼び出しを通じてソケット記述子を返した後、ソケットをネットワーク転送に使用する前にソケットを設定する必要があります。接続指向のソケットクライアントは、Connect関数を呼び出して、ローカルおよびリモートの情報をソケットデータ構造に保存します。ソケットを持たないクライアントとサーバー、およびサーバー指向のソケットは、bind関数を呼び出してローカル情報を構成します。バインド機能はソケットをマシン上のポートに関連付けます。その後、そのポートでサービス要求を待機できます。 int bind(int sockfd、struct sockaddr * my_addr、int addrlen); Sockfdはソケット関数を呼び出すことによって返されるソケット記述子であり、my_addrはローカルIPアドレスやポート番号などの情報を含むsockaddr型です。ポインタ; addrlenはしばしばsizeof(struct sockaddr)に設定されます。 struct sockaddr構造体型はソケット情報を格納するために使用されます:struct sockaddr {unsigned short sa_family; /*アドレスファミリ、AF_xxx * /char sa_data [14]; /* 14バイトプロトコルアドレス* /}; sa_familyは通常AF_INETです。インターネット(TCP /IP)アドレスファミリを表し、sa_dataにはソケットのIPアドレスとポート番号が含まれています。構造体型もあります:struct sockaddr_in {short int sin_family; /*アドレスファミリ* /unsigned short int sin_port; /*ポート番号* /struct in_addr sin_addr; /* IPアドレス* /unsigned char sin_zero [8]; /* sockaddr * /}と同じサイズを保つために0を埋めます;この構造は使用するのにより便利です。 Sin_zeroは、sockaddr_in構造体をstruct sockaddrと同じ長さにするために使用されます。これは、bzero()またはmemset()関数でゼロに設定できます。 sockaddr_inへのポインターとsockaddrへのポインターは互いに変換できます。つまり、関数の必須パラメーター・タイプがsockaddrの場合は、関数呼び出し時にsockaddr_inへのポインターをsockaddrへのポインターに変換できます。バインド機能を使用する場合は、次の割り当てを使用してローカルIPアドレスを自動的に取得し、未使用のポート番号をランダムに取得することができます。my_addr.sin_port = 0; /*システムは未使用のポート番号をランダムに選択します* /my_addr。 Sin_addr.s_addr = INADDR_ANY; /*ローカルIPアドレスを入力します* /my_addr.sin_portを0に設定すると、この関数は使用するポートを自動的に選択します。同様に、my_addr.sin_addr.s_addrをINADDR_ANYに設定すると、システムは自動的にローカルIPアドレスを入力します。 bind関数を使うときは、sin_portとsin_addrをネットワークバイトの先頭の順番に変換する必要がありますが、sin_addrは変換する必要はありません。コンピュータデータストアには、上位バイト優先と下位バイト優先の2つのバイト優先順位があります。インターネット上のデータはネットワーク上で上位バイト順に転送されるため、内部で下位バイトの優先順位でデータを格納するマシンでは、インターネット上でデータを転送するときにデータを変換する必要があります。いくつかのバイトオーダー変換関数を次に示します。< htonl():ホストバイトオーダーからネットワークバイトオーダーへの32ビット値の変換· htons():ホストバイトオーダーからネットワークワードへの16ビット値の変換セクションntohl():32ビット値をネットワークバイトオーダーからホストバイトオーダーに変換> ntohs():16ビット値をネットワークバイトオーダーからホストバイトオーダーに変換Bind()関数が成功した呼び出されると0を返し、エラーが発生すると-1を返し、errnoを対応するエラー番号に設定します。 bind関数を呼び出すときには、通常、ポート番号を1024未満の値に設定しないでください。1から1024は予約済みポート番号なので、1024のいずれにも占有されていないポート番号を選択できます。

接続接続指向のクライアントプログラムを確立するには、Connect関数を使用してソケットを設定し、リモートサーバーとのTCP接続を確立します関数のプロトタイプは次のとおりです。int connect(int sockfd、struct sockaddr * serv_addr、int addrlen); Sockfdソケット関数によって返されるソケット記述子であるか、serv_addrはリモートホストのIPアドレスとポート番号を含むポインタであり、addrlenはリモート地質構造の長さです。 Connect関数はエラーが発生すると-1を返し、errnoを対応するエラーコードに設定します。クライアントプログラムを設計するためにbind()を呼び出す必要はありません、この場合、宛先マシンのIPアドレスを知っているだけでよく、クライアントがサーバーに接続するポートは気にする必要はありません。プログラムのデータが壊れているときに占有ポートとあなたに通知します。

Copyright © Windowsの知識 All Rights Reserved