perl網路程式設計
簡單地發起連線
測試連線ftp埠,將列印220 (vsFTPd 2.2.2)
點選(此處)摺疊或開啟
-
use Socket;
-
$proto = getprotobyname('tcp');
-
my $net_addr = inet_aton("1.1.1.2") or die "aton error $!";
-
my $sock_addr = sockaddr_in(21, $net_addr) or die "sockaddr error $!";
-
socket(SOCK, PF_INET, SOCK_STREAM, $proto) or die "sock error ".$!;
-
connect(SOCK, $sock_addr) or die "connect error $!";
-
$ret = <SOCK>;
- print $ret;
與服務端互動
下面例子連線echo服務,客戶端敲什麼,服務端就會返回什麼。
點選(此處)摺疊或開啟
-
use Socket;
-
use IO::Handle;
-
-
my $host = "server2";
-
my $port = getservbyname("echo", "tcp");
-
my $proto = getprotobyname("tcp");
-
$host = inet_aton($host) or die "$host: $!";
-
socket(SOCK, AF_INET, SOCK_STREAM, $proto) or die "socket: $!";
-
my $sock_addr = sockaddr_in($port, $host);
-
connect(SOCK, $sock_addr) or die "connect: $!";
-
SOCK->autoflush(1); 開啟autoflush模式,可以讓客戶端將資訊立刻發出,而不是快取起來。
-
-
my $b_out = 0;
-
my $b_in = 0;
-
-
while(my $msg_out = <>)
-
{
-
print SOCK $msg_out;
-
my $msg_in = <SOCK>;
-
print $msg_in;
-
$b_out += length($msg_out);
-
$b_in += length($msg_in);
-
last unless $b_out < 10;
-
}
-
close SOCK;
- say "sent $b_out, recived $b_in";
實現簡單的echo服務端
點選(此處)摺疊或開啟
-
use 5.010;
-
use Socket;
-
use IO::Handle;
-
my $port = 4444;
-
my $proto = getprotobyname("tcp");
-
socket(SOCK, AF_INET, SOCK_STREAM, $proto) or die "socket: $!";
-
setsockopt(SOCK, SOL_SOCKET, OS_REUSEADDR, 1); 允許服務端崩潰後立刻重新使用以繫結的地址
-
my $sock_addr = sockaddr_in($port, inet_aton("0.0.0.0"));或者my $sock_addr = sockaddr_in($port, INADDR_ANY);
-
bind(SOCK, $sock_addr);
-
listen(SOCK, SOMAXCONN);
-
say "listen ok";
-
while(1)
-
{
-
my $remote_addr = accept(CONN, SOCK);
-
my $pid = fork();
-
next unless $pid == 0;
-
my($re_port, $re_addr) = sockaddr_in($remote_addr);
-
say "connection from ".inet_ntoa($re_addr).":$re_port";
-
CONN->autoflush(1);
-
while(<CONN>)
-
{
-
chomp;
-
print CONN reverse."\n";
-
}
-
say "connection finished from ".inet_ntoa($re_addr).":$re_port";
-
close CONN;
-
}
- close SOCK;
用IO::Socket實現的daytime客戶端
點選(此處)摺疊或開啟
-
use IO::Socket qw(:DEFAULT :crlf); 匯出crlf常量和預設常量
-
my $host = "server2";
-
$/ = CRLF; 設定行尾分隔符為常量CRLF
-
my $socket = IO::Socket::INET->new("$host:daytime") or die "socket: $!";
-
chomp (my $time = $socket->getline);
- say $time;
IO::Socket::INET的建構函式很強大,比如這種形式
點選(此處)摺疊或開啟
-
my $socket = IO::Socket::INET->new(PeerAddr=>"server2",
-
PeerPort=>"daytime(7)",
-
Type=>SOCK_STREAM,
- Proto=>"tcp") or die "socket: $!";
監聽本地埠:
點選(此處)摺疊或開啟
-
my $listen = IO::Socket::INET->new(
-
LocalPort=>"4444",
-
Type=>SOCK_STREAM,
-
Proto=>"tcp",
-
Listen=>128) 監聽佇列長度
- or die "socket: $!"
用物件導向方式實現echo服務端
點選(此處)摺疊或開啟
-
use 5.010;
-
use IO::Socket qw(:DEFAULT :crlf);
-
-
$/ = CRLF;
-
my $sock = IO::Socket::INET->new
-
(
-
Listen => 128,
-
LocalPort => 4444,
-
Reuse => 1,
-
Timeout => 60*60
-
)
-
or die "socet: $!";
-
say "listen ok";
-
while (1)
-
{
-
next unless my $session = $sock->accept;
-
next unless fork eq 0;
-
my $peer = gethostbyaddr($session->peeraddr, AF_INET) || $session->peerhost;
-
my $port = $session->peerport;
-
say "connection from [$peer : $port]";
-
-
while(<$session>)
-
{
-
chomp;
-
if($_ eq "quit" or $_ eq "exit") {last};
-
my $out = reverse;
-
print $session $out;
-
}
-
say "connection from [$peer : $port] finished";
-
close $session;
-
}
- close $sock;
用物件導向風格實現客戶端,要求能同時輸入和輸出
例如實現一個telnet客戶端,連線ftp埠
點選(此處)摺疊或開啟
-
use strict;
-
use 5.010;
-
-
use IO::Socket qw(:DEFAULT :crlf);
-
sub to_server
-
{
-
my $server = shift;
-
while(<>)
-
{
-
chomp;
-
print $server $_.CRLF;
-
}
-
}
-
-
sub from_server
-
{
-
my $server = shift;
-
$/ = CRLF;
-
while(<$server>)
-
{
-
chomp;
-
say;
-
}
-
}
-
-
my $sock = IO::Socket::INET->new("server2:21");
-
my $child = fork;
-
if($child)
-
{
-
to_server $sock;
-
$sock->shutdown(1);
-
sleep;
-
}
-
else
-
{
-
from_server $sock;
-
say "connection closed by foreign host.";
- }
執行
[root@server2 pl]# ./a.pl
220 (vsFTPd 2.2.2)
USER anonymous
331 Please specify the password.
PASS asd
230 Login successful.
help
214-The following commands are recognized.
ABOR ACCT ALLO APPE CDUP CWD DELE EPRT EPSV FEAT HELP LIST MDTM MKD
MODE NLST NOOP OPTS PASS PASV PORT PWD QUIT REIN REST RETR RMD RNFR
RNTO SITE SIZE SMNT STAT STOR STOU STRU SYST TYPE USER XCUP XCWD XMKD
XPWD XRMD
214 Help OK.
quit
221 Goodbye.
connection closed by foreign host.
220 (vsFTPd 2.2.2)
USER anonymous
331 Please specify the password.
PASS asd
230 Login successful.
help
214-The following commands are recognized.
ABOR ACCT ALLO APPE CDUP CWD DELE EPRT EPSV FEAT HELP LIST MDTM MKD
MODE NLST NOOP OPTS PASS PASV PORT PWD QUIT REIN REST RETR RMD RNFR
RNTO SITE SIZE SMNT STAT STOR STOU STRU SYST TYPE USER XCUP XCWD XMKD
XPWD XRMD
214 Help OK.
quit
221 Goodbye.
connection closed by foreign host.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26239116/viewspace-2125608/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 網路通訊程式設計程式設計
- py網路工具程式設計程式設計
- python 網路篇(網路程式設計)Python程式設計
- 【Perl程式設計-6】正規表示式--替換+轉化程式設計
- 網路程式設計-計算機網路三要素程式設計計算機網路
- python網路-Socket之TCP程式設計(26)PythonTCP程式設計
- linux c網路網路程式設計面試題收集Linux程式設計面試題
- HUST-計算機網路實驗-socket程式設計計算機網路程式設計
- 程式設計路漫漫程式設計
- Java中神經網路Triton GPU程式設計Java神經網路GPU程式設計
- 設計卷積神經網路CNN為什麼不是程式設計?卷積神經網路CNN程式設計
- 【go網路程式設計】-HTTP程式設計Go程式設計HTTP
- Java 網路程式設計(TCP程式設計 和 UDP程式設計)Java程式設計TCPUDP
- 網路安全程式設計 windowns防火牆培訓程式設計防火牆
- 【Linux網路程式設計】網路程式設計常見概念Linux程式設計
- 程式設計和網路程式設計入門程式設計
- JAVA網路程式設計(2)TCP程式設計Java程式設計TCP
- 網路程式設計程式設計
- Matlab程式設計之——卷積神經網路CNN程式碼解析Matlab程式設計卷積神經網路CNN
- 程式設計師面試常問計算機網路問題程式設計師面試計算機網路
- Python網路程式設計——程式Python程式設計
- JAVA學習線路:day14-網路程式設計Java程式設計
- Python 網路資料傳輸協議 TCP 程式設計Python協議TCP程式設計
- UDP&TCP Linux網路應用程式設計詳解UDPTCPLinux程式設計
- Java 網路程式設計 —— 非阻塞式程式設計Java程式設計
- 【網路程式設計】阻塞IO程式設計的坑程式設計
- 玩轉 PHP 網路程式設計全套之多程式程式設計PHP程式設計
- 網際網路假大牛橫飛:程式設計師最爛程式碼排行榜!!!程式設計師
- 一個老程式設計師在網際網路寒冬下的感悟程式設計師
- Perl程式:殭屍程式和孤兒程式
- 程式設計師如何實現“網際網路+”07-如何提高網站流量程式設計師網站
- Golang 網路程式設計Golang程式設計
- 網路程式設計概述程式設計
- Java 網路程式設計Java程式設計
- socket網路程式設計程式設計
- JAVA網路程式設計Java程式設計
- 網路程式設計-socket程式設計
- 網路程式設計-UDP程式設計UDP
- 程式設計師如何實現“網際網路+”01-程式設計師走向自由職業的 5 種常見方式程式設計師