工具標籤
目錄
工具標籤
Perl Socket 程式設計
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表示IPv6AF_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工具
免費脫衣圖片
用於從照片中去除衣服的線上人工智慧工具。
人工智慧驅動的應用程序,用於創建逼真的裸體照片
人工智慧支援投資研究,做出更明智的決策
熱門文章
熱門話題
20522
7
13634
4
11967
4
9011
17
8506
7
熱門工具
好用且免費的程式碼編輯器
中文版,非常好用
強大的PHP整合開發環境
視覺化網頁開發工具
神級程式碼編輯軟體(SublimeText3)












![PHP實戰開發極速入門: PHP快速創建[小型商業論壇]](https://img.php.cn/upload/course/000/000/035/5d27fb58823dc974.jpg)
