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