Perl Socket 编程

什么是 Socket?

Socket 是一种介质,两台计算机可以通过网络地址和端口在网络上进行交互。

假设,A(服务器)和 B(客户端)是两个系统,它们必须使用 Socket 相互交互以运行某些程序。

为了实现这一点,我们需要在 A(服务器)和 B(客户端)中创建 Socket,A 将处于接收状态,B 将处于发送状态。

A(服务器):

这里,服务器希望从 B(客户端)接收连接并执行一些任务并将结果发送回 B(客户端)。当我们执行代码时,A 中的操作系统会尝试创建 Socket 并将一个端口绑定到该 Socket。然后它将从发件人 B 那里监听。

B(客户端):

在这里,客户端希望将一些程序从他的系统发送到 A(服务器)进行一些处理。当我们执行代码时,B 中的操作系统尝试创建用于与 A(服务器)通信的 Socket,B 必须指定 B 希望连接的 A 的 IP 地址和端口号。

如果情况良好,两个系统将进行交互以通过一个端口交换信息。Perl 还支持 Socket 编程。

Perl 有一个本机 API,通过它可以实现 Socket。为了方便起见,有许多 CPAN 模块用于编写 Socket 程序。

服务器操作:

   - 创建 Socket    - 绑定带地址和端口的 Socket    - 收听该端口地址上的 Socket - 接受尝试使用服务器的端口和 IP 进行连接的客户端连接    - 执行操作

客户端操作:

   - 创建 Socket    - 使用其端口地址连接到服务器    - 执行操作

Socket.io

这是一个用于 Socket 编程的模块,它基于面向对象的编程。此模块不支持网络中使用的 INET 网络类型。

IO::Socket::INET:

此模块支持 INET 域,并基于 IO::Sockets 构建。 IO::Sockets 中可用的所有方法都在 INET 模块中继承的。

使用 TCP 协议的客户端和服务器:

TCP 是面向连接的协议,我们将使用此协议进行 Socket 编程。

在继续之前,让我们看看如何为 IO::Socket::INET 模块创建一个对象并创建一个 Socket。

$socket = IO::Socket::INET->new(PeerPort => 45787, 

PeerAddr => inet_ntoa(INADDR_BROADCAST), 

Proto => udp,LocalAddr => 

'localhost',Broadcast => 1 )

or 

die "Can't create socket and bind it : $@n";

IO::Socket::INET 模块中的新方法接受哈希数组作为子程序的输入参数。这个哈希数组是预定义的,我们只需要为我们想要使用的键提供值。此哈希数组使用了一个键列表。

含义
PeerAddr 远程主机地址
PeerHost PeerAddr 的同义词
PeerPort 远程端口或服务
LocalAddr 本地主机绑定地址
LocalHost LocalAddr 的同义词
LocalPort 本地主机绑定端口
Proto 协议名称(或编号)
Type Socket 类型
Listen 侦听的队列大小
ReuseAddr 在绑定之前设置 SO_REREADDR
Reuse 在绑定之前设置 SO_REREADDR
ReusePort 在绑定之前设置 SO_REUSEPORT
Boardcast 在绑定之前设置 SO_BROADCAST
Timeout 各种操作的超时值
MultiHomed 尝试多宿主主机的所有地址
Blocking 确定连接是否为阻塞模式

Server.pl

use IO::Socket; 

use strict; 

use warnings; 

my $socket = new IO::Socket::INET ( 

LocalHost => 'localhost', 

LocalPort => '45655', 

Proto => 'tcp', 

Listen => 1, 

Reuse => 1, 

); 

die "Could not create socket: $!n" unless $socket; 

print "Waiting for the client to send datan"; 

my $new_socket = $socket->accept(); 

while(<$new_socket>) { 

print $_; 

} 

close($socket);

Client.pl

use strict; 

use warnings; 

use IO::Socket; 

my $socket = new IO::Socket::INET ( 

PeerAddr => 'localhost', 

PeerPort => '45655', 

Proto => 'tcp', 

); 

die "Could not create socket: $!n" unless $socket; 

print $socket "Hello this is socket connection!n"; 

close($socket);

注意:

在 Socket 编程中,如果我们在本地主机上运行,​​我们必须首先执行 Server.pl,然后在不同的命令提示中单独执行 client.pl