ソケットは「ソケット」とも呼ばれ、通常、アプリケーションは「ソケット」を通じてネットワークに要求を送信したり、ネットワーク要求に応答したりして、コンピューター上のホストまたはプロセスが通信できるようにします。
この章では、Perl 言語で Socket サービスを使用する方法を説明します。
ソケット関数を使用してソケットサービスを作成します。
ポートをバインドするには、 bind関数を使用します。
listen関数を使用してポートをリッスンします。
クライアント要求を受信するには、 accept関数を使用します。
ソケット関数を使用してソケットサービスを作成します。
connect関数を使用してソケット サーバーに接続します。
次の図は、クライアントとサーバー間の通信プロセスを示しています。
Perl では、socket() 関数を使用してソケットを作成します。構文形式は次のとおりです。
ソケット(ソケット、ドメイン、タイプ、プロトコル);
パラメータ分析:
DOMAINによって作成されたソケットはプロトコル セットを指定します。 例えば:
AF_INET
IPv4 ネットワーク プロトコルを表します
AF_INET6
IPv6 を意味します
AF_UNIX
ローカルソケット (ファイルを使用) を意味します
TYPEソケットタイプは、接続指向か非接続指向かに応じて、SOCK_STREAM または SOCK_DGRAM に分類できます。
プロトコルは(getprotobyname('tcp'))[2]である必要があります。使用される実際のトランスポート プロトコルを指定します。
したがって、ソケット関数の呼び出し方法は次のようになります。
use Socket # PF_INET と SOCK_STREAM を定義しますsocket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]);
bind() を使用してソケットにアドレスを割り当てます。
バインド(ソケット、アドレス);
SOCKET ソケット記述子。 ADDRESS は、次の 3 つの要素を含むソケット アドレス (TCP/IP) です。
アドレス クラスター (TCP/IP、AF_INET、システム上ではおそらく 2)
ポート番号 (例: 21)
ネットワークアドレス (例: 10.12.12.168)
socket() を使用してソケットが作成された後は、使用されるプロトコルのみがソケットに与えられ、アドレスは割り当てられません。他のホストからの接続を受け入れる前に、bind() を呼び出してソケットにアドレスを割り当てる必要があります。
簡単な例は次のとおりです。
ソケットを使用します # PF_INET と SOCK_STREAM が定義されています $port = 12345; # リスニング ポート $server_ip_address = "10.12.12.168";bind( SOCKET, Pack_sockaddr_in($port, inet_aton($server_ip_address))) または die "ポートをバインドできません! ん";
または、アドレスのバインドに失敗した後に dieが実行されます。
ポートの設定は、setsockopt() オプション SO_REUSEADDR を設定することですぐに再利用できます。
Pack_sockaddr_in()関数は、アドレスをバイナリ形式に変換します。
ソケットがアドレスにバインドされた後、listen() 関数は可能な接続リクエストのリッスンを開始します。ただし、これは信頼性の高いデータ フローが保証されている場合にのみ使用できます。
listen(ソケット、キューサイズ);
SOCKET: ソケット記述子。
QUEUESIZE: 接続リクエストが到着すると、リスニング キューに入ります。接続リクエストが accept() によって受け入れられると、リスニング キューから削除されます。キューがいっぱいです。新しい接続を要求するとエラーが返されます。
接続が受け入れられると、成功した場合は 0 が返され、エラーの場合は -1 が返されます。
accept() 関数は、要求されたソケット接続を受け入れます。成功した場合はネットワーク アドレスの圧縮形式を返し、それ以外の場合は FALSE を返します。
accept( NEW_SOCKET, SOCKET );
NEW_SOCKET: ソケット記述子。
SOCKET: ソケット記述子。
accept() は通常、無限ループで使用されます。
while(1) { accept( NEW_SOCKET, SOCKT ) ....}
上記の例では、クライアントのリクエストをリアルタイムで監視できます。
connect() システムコールは、ソケットの接続を設定します。パラメータはファイル記述子とホストアドレスです。
接続(ソケット、アドレス);
次の例では、サーバー ソケットに接続されたインスタンスを作成します。
$port = 21; # ftp ポート $server_ip_address = "10.12.12.168"; connect( SOCKET, Pack_sockaddr_in($port, inet_aton($server_ip_address))) または die "ポートをバインドできません! n";
次に、完全な例を使用して、すべてのソケット関数のアプリケーションを理解します。
サーバーserver.plコード:
ターミナルを開き、次のコードを実行します。
$ perl server.pl アクセス開始: 7890
クライアント client.pl コード:
別のターミナルを開き、次のコードを実行します。
$ perl client.plI はサーバーからの情報です