Latest web development tutorials

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

上のホスト間またはコンピュータ間のプロセスが通信できるように、また、「ソケット」として知られているソケットは、アプリケーションは通常、ネットワーク要求や応答ネットワーク要求への「ソケット」によって発行されます。

このセクションでは、私たちがどのようにソケットサービスを使用するPerl言語を受信したすべてです。


サーバーを作成します。

  • ソケットサービスを作成するために、ソケット関数を使用ます。

  • ポートをバインドするbind関数を使用します。

  • ポート機能を聴いて聴い使用します。

  • 関数は、クライアント要求を受信受け入れる使用します。

クライアントを作成します。

  • ソケットサービスを作成するために、ソケット関数を使用ます。

  • connect関数を使用すると、サーバーソケットに接続します。

次のグラフは、クライアントとサーバー間の通信の流れを示しています。


サーバソケット機能

ソケット関数

次のようにPerlは、我々はソケットを作成するソケット()関数を使用し、構文は次のとおりです。

socket( SOCKET, DOMAIN, TYPE, PROTOCOL );

分析パラメータ:

  • 作成したプロトコル設定されたソケット・ドメインを指定します。 例えば:

    • AF_INET IPv4ネットワークプロトコルを示し
    • AF_INET6 IPv6の
    • AF_UNIX (ファイルを使用して)ローカルソケットを表し

  • TYPEソケットタイプがSOCK_STREAMまたはSOCK_DGRAMに接続指向またはコネクションすることができます

  • PROTOCOLは(getprotobyname( 'TCP'))であるべきである[2]。実際のトランスポートプロトコルを指定します。

次のようにソケット関数呼び出しので。

use Socket     # 定义了 PF_INET 和 SOCK_STREAM

socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]);

バインド()関数

バインドを使用してください()ソケットにアドレスを割り当てます。

bind( SOCKET, ADDRESS );

ソケット記述子をソケット。 ADDRESSは、ソケットアドレス(TCP / IP)は、3つの要素が含まれます:

  • アドレスファミリ(TCP / IPは、2であってもよいし、システム上、AF_INETです)

  • (例えば21など)ポート番号

  • (例えば10.12.12.168など)のネットワークアドレス

ソケットを使用した後に()ソケットを作成し、ちょうど彼らが使用するプロトコルを与えるとアドレスを割り当てません。 他のホスト接続を受け入れる前に、まずソケットにアドレスを割り当てる)(バインドを呼び出す必要があります。

次のように簡単な例は次のとおりです。

use Socket        # 定义了 PF_INET 和 SOCK_STREAM

$port = 12345;    # 监听的端口
$server_ip_address = "10.12.12.168";
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address)))
   or die "无法绑定端口! \n";

または実行に失敗したバインドアドレスで死にます

ポートを設定するためには、setsockopt()SO_REUSEADDRオプションを設定することで、すぐに再利用することができます。

pack_sockaddr_in()関数は、バイナリ形式にアドレスを変換します。

()関数を聞きます

ソケットとアドレスが結合すると、()関数を聴く可能な接続要求のリスニングを開始します。 使用する場合しかし、これは信頼性の高いデータストリームを保証することができます。

listen( SOCKET, QUEUESIZE );

SOCKET:ソケット記述子。

QUEUESIZE:接続要求があった場合に整数が到着すると、それは聞いてキューに入り、キューのサイズを監視するための決定であり、キューがいっぱいになると、新しい接続、接続要求がキューモニターから削除、受け入れるために)(受け入れのときリクエストはエラーを返します。

接続が受け入れられると、それが成功、エラーの戻り-1に0を返します。

()関数を受け入れます

()関数を受け入れる要求ソケット接続を受け付けます。 ネットワークアドレス圧縮形式で成功した場合、それ以外の場合はFALSEを返します。

accept( NEW_SOCKET, SOCKET );

SOCKET:ソケット記述子。

ADDRESS:ADDRESSは、ソケットアドレス(TCP / IP)で、3つの要素が含まれています。

  • アドレスファミリ(TCP / IPは、2であってもよいし、システム上、AF_INETです)

  • (例えば21など)ポート番号

  • (例えば10.12.12.168など)のネットワークアドレス

通常、無限ループに適用される)(受け入れます:

while(1) {
   accept( NEW_SOCKET, SOCKT );
   .......
}

上記の例では、クライアントの要求にリアルタイムで監視することができます。


クライアント機能

()関数を接続

ソケット接続パラメータファイルディスクリプタとホストアドレスを設定する()システムコールを接続します。

connect( SOCKET, ADDRESS );

以下は、サーバインスタンスへのソケット接続を作成します。

$port = 21;    #  ftp 端口
$server_ip_address = "10.12.12.168";
connect( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address)))
    or die "无法绑定端口! \n";

完全な例

次に、完全な例を介してすべてのソケット・アプリケーションの機能を理解することがあります:

サーバーserver.plコード:

#!/usr/bin/perl -w
# Filename : server.pl

use strict;
use Socket;

# 使用端口 7890 作为默认值
my $port = shift || 7890;
my $proto = getprotobyname('tcp');
my $server = "localhost";  # 设置本地地址

# 创建 socket, 端口可重复使用,创建多个连接
socket(SOCKET, PF_INET, SOCK_STREAM, $proto)
   or die "无法打开 socket $!\n";
setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1)
   or die "无法设置 SO_REUSEADDR $!\n";

# 绑定端口并监听
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
   or die "无法绑定端口 $port! \n";

listen(SOCKET, 5) or die "listen: $!";
print "访问启动:$port\n";

# 接收请求
my $client_addr;
while ($client_addr = accept(NEW_SOCKET, SOCKET)) {
   # send them a message, close connection
   my $name = gethostbyaddr($client_addr, AF_INET );
   print NEW_SOCKET "我是来自服务端的信息";
   print "Connection recieved from $name\n";
   close NEW_SOCKET;
}

ターミナルを開き、次のコードを実行します。

$ perl sever.pl
访问启动:7890

クライアントclient.plコード:

#!/usr/bin/perl -w
# Filename : client.pl

use strict;
use Socket;

# 初始化地址与端口
my $host = shift || 'localhost';
my $port = shift || 7890;
my $server = "localhost";  # 主机地址

# 创建 socket 并连接
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2])
   or die "无法创建 socket $!\n";
connect( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
   or die "无法连接:port $port! \n";

my $line;
while ($line = <SOCKET>) {
        print "$line\n";
}
close SOCKET or die "close: $!";

別のターミナルを開き、次のコードを実行します。

$ perl client.pl
我是来自服务端的信息