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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- perl 程式設計利器程式設計
- perl程式設計技巧程式設計
- Perl網路程式設計的10個模組程式設計
- perl 物件導向程式設計物件程式設計
- PERL物件程式設計基礎(轉)物件程式設計
- perl語言程式設計 下載程式設計
- mod_perl 程式設計介紹 (轉)程式設計
- 網路通訊程式設計程式設計
- 網路協程程式設計程式設計
- Socket 程式設計 (網路篇)程式設計
- Cultured Perl: 吸引 C 和 Java 程式設計師目光的 Perl 5.6 (轉)Java程式設計師
- Python網路Socket程式設計Python程式設計
- python 網路篇(網路程式設計)Python程式設計
- 傳奇程式設計師Larry Wall:Perl的樂趣程式設計師
- 第十三章 Perl的物件導向程式設計物件程式設計
- Perl在CGI程式設計中常用的函式 (轉)程式設計函式
- 【Perl程式設計-6】正規表示式--替換+轉化程式設計
- Perl 語言程式設計 第三版 線上版本程式設計
- 傳奇程式設計師Larry Wall:Perl的樂趣 (轉)程式設計師
- linux c網路網路程式設計面試題收集Linux程式設計面試題
- HUST-計算機網路實驗-socket程式設計計算機網路程式設計
- python網路-Socket之TCP程式設計(26)PythonTCP程式設計
- Java的網路功能與程式設計 一 (轉)Java程式設計
- Java中神經網路Triton GPU程式設計Java神經網路GPU程式設計
- 程式設計路漫漫程式設計
- 為Java程式設計師準備的10分鐘Perl教程Java程式設計師
- 【go網路程式設計】-HTTP程式設計Go程式設計HTTP
- 程式設計師面試常問計算機網路問題程式設計師面試計算機網路
- C語言Socket程式設計(計算機網路作業)C語言程式設計計算機網路
- 我來談談網路設計,程式設計,網管設計三者群體的差異 (轉)程式設計
- 網路安全程式設計 windowns防火牆培訓程式設計防火牆
- 關於程式設計師寫文件(網路轉載)程式設計師
- JAVA網路程式設計(2)TCP程式設計Java程式設計TCP
- 程式設計和網路程式設計入門程式設計
- 網路程式設計程式設計
- perl Statistics::Descriptive Perl 的統計模組
- 網頁設計師 vs 網頁程式設計師網頁程式設計師
- 不會程式設計?來用Excel抓取網路資料程式設計Excel