perl實現socket通訊

2021-05-26 10:18:57 字數 4060 閱讀 3623

perl中可以直接呼叫linux下c庫中berkeley套接字內建介面,呼叫方式和c語言一致,只是換成perl的語法而已。偶就不說了,網上一籮筐資料。

我使用perl中的io::socket模組來開發,個人經驗使用perl語言開發的過程中能使用模組的盡量使用,乙個是可靠,二個是方便,最主要的是便於跨平台的移植,linux也好,windows也好只要安裝了相應的模組,**不需要修改直接執行。

socket位址協議簇分為af_unix、af_inet、af_inet6等,常用的也就是af_inet,其它兩種沒用過,不好說。io::socket::inet模組(包含在模組io::socket中)是針對af_inet開發的,所以正常情況下,都是結合這兩個模組進行perl**的書寫。

client端**:

#!/usr/bin/perl -w

use io::socket;  ##io::socket::inet模組是io::socket模組的子模組,不用重新use。

use io::select;  ##該模組和linux下select()函式實現的功能一致,另擴充套件更過的功能。可以perldoc檢視。

# hash to install ip port

%ser_info = (

"ser_ip" => "1.1.1.1",

"ser_port" => "8888",

);&main();

sub main ;

my $ser_port = $ser_info;

##io::socket::inet->new()用於初始化乙個socket連線,其中整合了socket、inet_aton、connect、bind、listen等功能。就不需要單獨轉換ip位址為網路位址結構了,直接使用ip位址就ok了。

##具體引數下面單獨介紹。

my $socket = io::socket::inet->new(

peeraddr => "$ser_addr",

peerport => "$ser_port",

type => sock_stream,

proto => "tcp",

) or die "can not create socket connect.$@";

$socket->send("client ok!\n",0);  ##傳送訊息至伺服器端。

$socket->autoflush(1); 

my $sel = io::select->new($socket); ##建立select物件

while (my @ready = $sel->can_read)

$sel->remove($fh); 

close $fh;

close file;}}

}$socket->close() or die "close socket failed.$@";

}server端**:

#!/usr/bin/perl -w

use io::socket;

use io::select;

# hash to install ip port

%ser_info = (

"cli_ip" => "2.2.2.2",

"cli_port" => "9999",

"ser_ip" => "1.1.1.1",

"ser_port" => "8888",

);&main();

sub main ;

my $cli_port = $ser_info;

my $ser_addr = $ser_info;

my $ser_port = $ser_info;

my $socket = io::socket::inet->new(

peeraddr => "$cli_addr",  #client端ip位址

peerport => "$cli_port",  #client端埠號

localaddr => "$ser_addr",  #本機ip位址

localport => "$ser_port",   #定義本機的port,然後進行bind

type => sock_stream,  #套接字型別

proto => "tcp", #協議名

listen => 20,  #定義listen的最大數

)or die "can not create socket connect.$@";

my $sel = io::select->new($socket);

while (my @ready = $sel->can_read)

else }}

$socket->close() or warn "close socket failed.$@";  

}還是使用模組開發簡單一些吧。

下面簡單介紹一下io::socket::inet->new()支援的引數。直接貼出search.cpan.org中的介紹,水平有限,就不翻譯了啊。

peeraddr    remote host address          [:]

peerhost    synonym for peeraddr

peerport    remote port or service       [()] |

localaddr   local host bind address      hostname[:port]

localhost   synonym for localaddr

localport   local host bind port         [()] |

proto       protocol name (or number)    "tcp" | "udp" | ...

type        socket type                  sock_stream | sock_dgram | ...

listen      queue size for listen

reuseaddr   set so_reuseaddr before binding

reuse       set so_reuseaddr before binding (deprecated, prefer reuseaddr)

reuseport   set so_reuseport before binding

broadcast   set so_broadcast before binding

timeout     timeout value for various operations

multihomed  try all addresses for multi-homed hosts

blocking    determine if connection will be blocking mode

有幾點注意,說明一下:

1:定義 "listen" 就等於呼叫了 listen()函式,服務端必須的。

2:定義 「type => sock_stream」 就等於呼叫了 connect()函式,客戶端、服務端都是必須的。如果使用udp(sock_dgram),客戶端定義就ok了,服務端就不需要啦。

3:peerhost、localhost 可以使用「hostname」或者「1.1.1.1」形式的ip位址。

4:peerport、localport 可以使用「servicename」前提是必須定義的,linux下在 "/etc/services" 中定義。建議直接使用數字「8888」

5:blocking 值為0,表示非阻塞模式。不定義或者值為1,表示阻塞模式。

另有兩個方法,也是常用的。

1:connected

if (defined $socket->connected()) {}

該函式用於判斷當前socket連線是否連線上,如果連線上返回對端的位址,反之沒有連線上則返回 "undef" 。

2:sockopt(opt [, val])

該函式用於設定套接字選項值(等價於呼叫setsockopt()函式),如果不新增value值則返回套接字選項值的當前值(等價於呼叫getsockopt()函式)。

例如:設定建立長連線。$socket->sockopt(so_keepalive,1);

實現Socket通訊

1.網頁測試工具 2.串列埠除錯工具llcom 相關資訊輸出到串列埠,便於掌握程式的運 況 3.arduino string庫函式詳解 本程式 使用socket實現通訊,dtu向伺服器傳送 ready 表示裝置上線,服務端向dtu傳送1或2控制dtu上led燈的顏色,3關閉所有socket,裝置下線...

C 實現Socket通訊

using system using system.collections.generic using system.linq using system.text using system.net using system.net.sockets class program static socke...

利用socket實現通訊

利用套接字 socket 實現通訊,client傳送兩個數,server接收並返回這兩個數的和 server.c include include include include include includeint main client.c include include include 包含套接...