1. 概要

このチュートリアルでは、ソケットの基本と、使用可能なポートをソケットにバインドする方法について説明します。

2. ソケットの紹介

コンピュータネットワークのソケットは、2つのノードが相互に接続および通信するためのエンドポイントです。さらに、双方向のFIFO通信を作成します。 さらに、通信の両端にソケット接続を作成する必要があります。 さらに、ソケットアドレスには通常、IPアドレスとポート番号が含まれます。

通常、クライアントサーバーアプリケーションはソケットを使用します。 クライアント/サーバーアプリケーションでは、サーバーは最初にサーバーソケット接続の作成を担当します。 したがって、ネットワークポートアドレスに接続します。 一方、クライアントはソケット接続も作成し、特定のソケットサーバーに接続しようとします。 したがって、接続が確立されるとすぐに、クライアントとサーバー間のデータ転送が開始されます。

ソケットは、データグラムソケットとストリームソケットの2つのカテゴリに分類できます。データグラムソケットは、コネクションレス型のUDPソケットです。 したがって、データを転送するために接続を確立する必要はありません。 データグラムソケットの例はメールボックスです。 データグラムソケットとは異なり、スチームベースのソケットはコネクション型のストリームTCPソケットです。 したがって、データを転送する前に接続を確立する必要があります。 さらに、それは電話と同じように機能します。

したがって、サーバーノードはTCPまたはUDPソケットを作成し、特定のポートで特定のIPアドレスをリッスンします。 次に、サーバーはクライアントが接続するのを待ちます。 さらに、クライアントは、提供されたリモートIPアドレス、ポート番号、およびTCP/UDPプロトコル情報を使用してサーバーに接続できます。 通常、ソケットはすべての主要なオペレーティングシステムでサポートされています。 さらに、ソケットは、コンピュータネットワークのファイルシステムと同様のファイル記述子を提供します。

3. ソケットプログラミングの基礎

ソケットプログラミングは、ネットワークでデータを送信するためのソケットを作成および接続する方法です。ソケット機能の基本とネットワークでの使用について説明します。

関数socket()は、新しいソケット記述子を作成します。 bind()関数は、ローカルアドレスまたはポートにソケットを接続します。 listen()を使用して、サーバーソケットがクライアントソケットからの接続を受信する準備ができていることを示すことができます。 ここで、接続ステータスを知るために、確認を提供する accept()、を使用します。

クライアントとサーバーソケット間の接続を確立するとすぐに、データの転送を開始する準備が整います。 まず、 send()を使用してリモートマシンにデータを送信します。 同様に、関数 receive()は、リモートマシンからデータを受信するために使用されます。 最後に、データ転送が完了したら、 close()を使用して接続を終了します。

コマンドconnect()を使用して、リモートIPアドレスとポートを使用してサーバーソケットに接続しようとします。 通常、TCPで使用されます。 ただし、UDPでは、接続を確立せずに sendto()を使用します。 したがって、UDPでは connect()コマンドをスキップします。 私たちが議論したコマンドの要約を見てみましょう:

TCPのソケット関数を使用したストリームベースのソケット接続を見てみましょう。

UDPプロトコルを使用したデータグラムベースのソケット接続の場合、 connect()を使用する必要はありません。

4. バインドコマンド

bindコマンドは、ソケットをローカルポートに接続し、ポートを予約します。 さらに、 bind()関数は、ソケット記述子 s_d を入力として受け取り、ステータスを出力として返します。

入力ソケット記述子s_dには、ソケットストリームとソケット接続の確立に使用されるプロトコルの情報が含まれています。 したがって、 bindコマンドは、socket()を呼び出して、ソケット記述子を使用してローカルポートを接続した後に呼び出されます。

このコマンドはサーバー側で使用されるため、クライアントはバインド中に割り当てられた特定のポートに接続できます。 したがって、サーバープロセスは、クライアントの要求をリッスンできる特定のポートに対して要求を行います。 さらに、bindコマンドは同じマシンでローカルに機能します。 バインドは、サーバーでパケットを受信するためのアドレスを提供します。

ここでは、サーバーソケットをポート8323で前述のIPアドレスにバインドします。さらに、バインド呼び出しはTCPプロトコルとUDPプロトコルの両方の場合と同様です。

5. ポートをバインドするさまざまな方法

前の例では、TCPまたはUDPソケットを特定のハードコードされたポート8323にバインドします。 ただし、ポートがすでに使用されている可能性があります。 したがって、ハードコードされたポートにバインドすることが常に適切であるとは限りません。 したがって、このタスクをオペレーティングシステムに委任して、バインドに使用可能なランダムなポートを割り当てることができます。

さらに、ポート番号0でbind()を呼び出すことにより、使用可能な任意のポートをバインドできます。したがって、固定ポート番号を指定しない場合、オペレーティングシステムは使用可能なポートから1つを提供します。

さらに、使用可能なポートのセットからランダムなポート番号を生成できます。したがって、特定のポートを利用したくない場合は、ランダムに割り当てられたポート番号を通信に使用します。

6. 結論

このチュートリアルでは、ソケットとソケットプログラミングの基本について説明しました。 具体的には、ソケットをさまざまなポートにバインドするさまざまな方法を検討しました。