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
。