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
。