搜尋
  • 登入
  • 報名
密碼重置成功

關注您感興趣的項目並了解有關它們的最新消息

首頁 後端開發 珀爾 Perl 入門教程 Perl Socket 程式設計

Perl Socket 程式設計

收藏 5
閱讀 17408
更新時間 2016-09-11

Socket又稱"套接字",應用程式通常透過"套接字"向網路發出請求或應答網路請求,使主機間或一台電腦上的進程間可以通訊。

本章節我們為大家接收 Perl 語言中如何使用 Socket 服務。


建立服務端

  • #使用 socket 函數來建立 socket服務。

  • 使用 bind 函數綁定連接埠。

  • 使用 listen 函式監聽埠。

  • 使用 accept 函數接收客戶端請求。

建立客戶端

  • 使用 socket 函數來建立 socket 服務。

  • 使用 connect 函數連接到 socket 服務端。

以下圖表示範了客戶端與服務端之間的通訊流程:


服務端socket 函數

socket 函數

Perl 中,我們用socket()函數來建立套接字,語法格式如下:

socket( SOCKET, DOMAIN, TYPE, PROTOCOL );

參數解析:

  • #DOMAIN 建立的套接字指定協定集。 例如:


    • AF_INET 表示IPv4網路協定

    • AF_INET6 表示IPv6

    • AF_UNIX 表示本機套接字(使用一個檔案)

  • TYPE 套接字類型可以根據是面向連接的還是非連接分為SOCK_STREAM或SOCK_DGRAM

  • PROTOCOL 應該是(getprotobyname('tcp'))[2]。指定實際使用的傳輸協定。

所以socket 函數呼叫方式如下:

use Socket     # 定义了 PF_INET 和 SOCK_STREAM

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

bind() 函數

使用bind() 為套接字分配一個位址:

bind( SOCKET, ADDRESS );

SOCKET 一個socket的描述子。 ADDRESS 是socket 位址( TCP/IP ) 包含了三個元素:

  • #位址簇(TCP/IP, 是AF_INET, 在你係統上可能是2)

  • 連接埠號(例如21)

  • 網路位址(例如10.12.12.168)

使用socket()創建套接字後,只賦予其所使用的協議,並未分配位址。在接受其它主機的連線前,必須先呼叫bind()為套接字分配一個位址。

簡單實例如下:

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";

or die 在綁定位址失敗後執行。

透過設定 setsockopt() 可選項 SO_REUSEADDR 設定連接埠可立即重複使用。

pack_sockaddr_in() 函數將位址轉換為二進位格式。

listen() 函數

當socket和一個位址綁定之後,​​listen()函數會開始監聽可能的連線請求。然而,這只能在有可靠資料流保證的時候使用:

listen( SOCKET, QUEUESIZE );

SOCKET : 一個socket的描述子。

QUEUESIZE : 是一個決定監聽佇列大小的整數,當有一個連接請求到來,就會進入此監聽佇列;當一個連線請求被accept()接受,則從監聽佇列中移出;當佇列滿後,新的連線請求會回傳錯誤。

一旦連線被接受,回傳0表示成功,錯誤回傳-1。

accept() 函數

accept() 函式接受請求的socket連線。如果成功則回傳壓縮形式的網路位址,否則回傳FALSE:

accept( NEW_SOCKET, SOCKET );

SOCKET : 一個socket的描述符。

ADDRESS : ADDRESS 是socket 位址( TCP/IP ) 包含了三個元素:

  • 位址簇(TCP/IP, 是AF_INET, 在你係統上可能是2)

  • 連接埠號(例如21)

  • #網路位址(例如10.12.12.168)

#accept() 通常應用在無限迴圈當中:

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

以上實例可以即時監聽客戶端的請求。


客戶端函數

connect() 函數

#connect()系統呼叫為一個套接字設定連接,參數有檔案描述符和主機位址。

connect( SOCKET, ADDRESS );

以下建立一個連接到服務端socket 的實例:

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

完整實例

接下來我們透過一個完整實例來了解下所有socket 函數的應用:

服務端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
我是来自服务端的信息
熱AI工具
Undress AI Tool
Undress AI Tool

免費脫衣圖片

AI Clothes Remover
AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undresser.AI Undress
Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

Stock Market GPT
Stock Market GPT

人工智慧支援投資研究,做出更明智的決策

熱門工具
記事本++7.3.1
記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版
SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1
禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6
Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版
SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)