最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

perl Socket編程實(shí)例代碼

 更新時(shí)間:2013年02月01日 00:29:28   作者:  
Perl的networking 功能非常強(qiáng)大,基本上用c/c++能做的事perl都能做,而且做得更輕松方便,甚至可以只用10來(lái)行代碼就完成了c/c++要幾十上百甚至幾百行才能完成得好的工作

在networking方面,最基礎(chǔ)的是BSD socket編程,但往往perl入門(mén)時(shí)在這個(gè)方面,最頭疼的無(wú)疑是如何開(kāi)始,如何Step by step。最好的藥方就是Example,一段完整的可以運(yùn)行(working)的代碼,通過(guò)實(shí)踐來(lái)感受遠(yuǎn)比看枯燥的manual來(lái)得深刻。

     以下給出幾段使用Socket及IO::Socket編寫(xiě)的Server/client,他們能實(shí)現(xiàn)最簡(jiǎn)單但是卻最基本的任務(wù),包括一個(gè)forking/accept的模型??梢灾苯訌?fù)制這些代碼,然后小加修改即可開(kāi)發(fā)一些小型的tcp/udp應(yīng)用了。

TCP 客戶(hù)端, Socket 模塊

簡(jiǎn)介:實(shí)現(xiàn)從服務(wù)器端讀取一行信息然后返回

復(fù)制代碼 代碼如下:

#!/usr/bin/perl -w
# tcp_socket_cli.pl
use strict;
use Socket;
my $addr = $ARGV[0] || '127.0.0.1';
my $port = $ARGV[1] || '3000';
my $dest = sockaddr_in($port, inet_aton($addr));
my $buf = undef;
socket(SOCK,PF_INET,SOCK_STREAM,6) or die "Can't create socket: $!";
connect(SOCK,$dest)                or die "Can't connect: $!";
my $bs = sysread(SOCK, $buf, 2048); # try to read 2048
print "Received $bs bytes, content $buf\n"; # actually get $bs bytes
close SOCK;

執(zhí)行結(jié)果:
perl tcp_socket_cli.pl localhost 25
Received 41 bytes, content 220 ESMTP Postfix - ExtMail 0.12-hzqbbc

TCP 服務(wù)端 Socket模塊, forking/accept模型
簡(jiǎn)介:一個(gè)多進(jìn)程的TCP服務(wù)器,sample中實(shí)現(xiàn)了daytime的功能

復(fù)制代碼 代碼如下:

#!/usr/bin/perl -w
# tcp_socket_dt_srv.pl
use strict;
use Socket;
use IO::Handle;
use POSIX qw(WNOHANG);
my $port     = $ARGV[0] || '3000';
my $proto    = getprotobyname('tcp');
$SIG{'CHLD'} = sub {
     while((my $pid = waitpid(-1, WNOHANG)) >0) {
          print "Reaped child $pid\n";
      }
};
socket(SOCK, AF_INET, SOCK_STREAM, getprotobyname('tcp'))
    or die "socket() failed: $!";
setsockopt(SOCK,SOL_SOCKET,SO_REUSEADDR,1)
    or die "Can't set SO_REUSADDR: $!" ;
my $my_addr = sockaddr_in($port,INADDR_ANY);
bind(SOCK,$my_addr)    or die "bind() failed: $!";
listen(SOCK,SOMAXCONN) or die "listen() failed: $!";
warn "Starting server on port $port...\n";
while (1) {
     next unless my $remote_addr = accept(SESSION,SOCK);
     defined(my $pid=fork) or die "Can't fork: $!\n";

     if($pid==0) {
          my ($port,$hisaddr) = sockaddr_in($remote_addr);
          warn "Connection from [",inet_ntoa($hisaddr),",$port]\n";
          SESSION->autoflush(1);
          print SESSION (my $s = localtime);
          warn "Connection from [",inet_ntoa($hisaddr),",$port] finished\n";
          close SESSION;
          exit 0;
      }else {
          print "Forking child $pid\n";
      }
}
close SOCK;

利用上述tcp_socket_cli.pl訪(fǎng)問(wèn)該server的執(zhí)行結(jié)果:
[hzqbbc@local misc]$ perl tcp_socket_dt_srv.pl
Starting server on port 3000...
Connection from [127.0.0.1,32888]
Connection from [127.0.0.1,32888] finished
Reaped child 13927
Forking child 13927

TCP 客戶(hù)端 ,IO::Sockiet模塊
簡(jiǎn)介:同樣為客戶(hù)端,不過(guò)使用的是IO::Socket 面向?qū)ο竽K

復(fù)制代碼 代碼如下:

#!/usr/bin/perl -w
# tcp_iosocket_cli.pl
use strict;
use IO::Socket;
my $addr = $ARGV[0] || '127.0.0.1';
my $port = $ARGV[1] || '3000';
my $buf = undef;
my $sock = IO::Socket::INET->new(
        PeerAddr => $addr,
        PeerPort => $port,
        Proto    => 'tcp')
    or die "Can't connect: $!\n";
$buf = <$sock>;
my $bs = length($buf);
print "Received $bs bytes, content $buf\n"; # actually get $bs bytes
close $sock;

TCP 服務(wù)端, IO::Socket模塊, forking/accept模型
簡(jiǎn)介:同樣的一個(gè)daytime
服務(wù)器,使用IO::Socket重寫(xiě)。

復(fù)制代碼 代碼如下:

#!/usr/bin/perl
# tcp_iosocket_dt_srv.pl
use strict;
use IO::Socket;
use POSIX qw(WNOHANG);
$SIG = sub {
     while((my $pid = waitpid(-1, WNOHANG)) >0) {
          print "Reaped child $pid\n";
      }
};
my $port     = $ARGV[0] || '3000';
my $sock = IO::Socket::INET->new( Listen    => 20,
                                  LocalPort => $port,
                                  Timeout   => 60*1,
                                  Reuse     => 1)
  or die "Can't create listening socket: $!\n";
warn "Starting server on port $port...\n";
while (1) {
     next unless my $session = $sock->accept;
     defined (my $pid = fork) or die "Can't fork: $!\n";

     if($pid == 0) {
          my $peer = gethostbyaddr($session->peeraddr,AF_INET) || $session->peerhost;
          my $port = $session->peerport;
          warn "Connection from [$peer,$port]\n";
          $session->autoflush(1);
          print $session (my $s = localtime), "\n";
          warn "Connection from [$peer,$port] finished\n";
          close $session;
          exit 0;
      }else {
          print "Forking child $pid\n";
      }
}
close $sock;

現(xiàn)在再介紹使用Socket及IO::Socket模塊來(lái)進(jìn)行Unix domain Socket的client/server開(kāi)發(fā)。Unix Domain Socket(簡(jiǎn)稱(chēng)unix socket)和TCP/UDP等INET類(lèi)型socket相比起來(lái)有幾個(gè)優(yōu)點(diǎn):
1)、安全性高,unix socket只在單機(jī)環(huán)境中使用,不支持機(jī)器之間通信
2)、效率高,執(zhí)行時(shí)的速度約是TCP的兩倍,多用于操作系統(tǒng)內(nèi)部通信(IPC)
3)、支持SOCK_DGRAM,但和UDP不同,前后消息是嚴(yán)格有序的

因此使用Unix socket來(lái)設(shè)計(jì)單機(jī)的IPC應(yīng)用是首選。非常實(shí)用。大量的Unix應(yīng)用軟件都使用unix socket來(lái)進(jìn)行程序間通信。

Unix Domain Socket客戶(hù)端, Socket模塊
簡(jiǎn)介:使用Unix domain socket的客戶(hù)端。

復(fù)制代碼 代碼如下:

#!/usr/bin/perl -w
use strict;
use Socket;
use IO::Handle;
my $path = $ARGV[0] || '/tmp/daytime.sock';
socket(my $sock, PF_UNIX, SOCK_STREAM, 0);
my $sun = sockaddr_un($path);
connect($sock, $sun) or die "Connect: $!\n";
$sock->autoflush(1);
my $buf = <$sock>;
my $bs = length($buf);
print "Received $bs bytes, content $buf\n";
close $sock;

Unix Domain Socket 服務(wù)端, Socket模塊
簡(jiǎn)介:使用Unix domain socket實(shí)現(xiàn)的daytime服務(wù)器。
復(fù)制代碼 代碼如下:

#!/usr/bin/perl -w
# tcp_socket_dt_srv.pl
use strict;
use Socket;
use IO::Handle;
use POSIX qw(WNOHANG);
my $path     = $ARGV[0] || '/tmp/daytime.sock';
$SIG{'CHLD'} = sub {
      while((my $pid = waitpid(-1, WNOHANG)) >0) {
            print "Reaped child $pid\n";
        }
};
socket(SOCK, PF_UNIX, SOCK_STREAM, 0)
    or die "socket() failed: $!";
setsockopt(SOCK,SOL_SOCKET,SO_REUSEADDR,1)
    or die "Can't set SO_REUSADDR: $!" ;
unlink $path if -r $path;
bind(SOCK,sockaddr_un($path))    or die "bind() failed: $!";
listen(SOCK,SOMAXCONN)           or die "listen() failed: $!";
warn "Starting server on path $path...\n";
while (1) {
      next unless my $sockname = accept(SESSION,SOCK);
      defined (my $pid=fork) or die "Can't fork: $!\n";

      if($pid==0) {
          SESSION->autoflush(1);
          print SESSION (my $s = localtime);
          close SESSION;
          exit 0;
       }else {
          print "Forking child $pid\n";
       }
}
close SOCK;

相關(guān)文章

  • Perl 批量添加Copyright版權(quán)信息

    Perl 批量添加Copyright版權(quán)信息

    對(duì)所有輸入文件,如果沒(méi)有版權(quán)信息則加上版權(quán)信息,否則什么都不做,并對(duì)原文件以.bak結(jié)尾備份,需要的朋友可以參考下
    2017-08-08
  • Perl中的正則表達(dá)式介紹

    Perl中的正則表達(dá)式介紹

    正則表達(dá)式是 Perl 語(yǔ)言的一大特色,也是 Perl 程序中的一點(diǎn)難點(diǎn),不過(guò)如果大家能夠很好的掌握他,就可以輕易地用正則表達(dá)式來(lái)完成字符串處理的任務(wù),當(dāng)然在 CGI 程序設(shè)計(jì)中就更能得心應(yīng)手了
    2013-07-07
  • Perl學(xué)習(xí)筆記之CPAN使用介紹

    Perl學(xué)習(xí)筆記之CPAN使用介紹

    這篇文章主要介紹了Perl學(xué)習(xí)筆記之CPAN使用介紹,本文講解了什么是CPAN、CPAN的目錄作用介紹、CPAN安裝Perl Module的兩種方法等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • perl 中的or與||的區(qū)別

    perl 中的or與||的區(qū)別

    or比||優(yōu)先級(jí)低,除此之外,兩者無(wú)區(qū)別
    2013-02-02
  • perl的格式化(Format)報(bào)表輸出實(shí)現(xiàn)代碼

    perl的格式化(Format)報(bào)表輸出實(shí)現(xiàn)代碼

    perl有最好的文本數(shù)據(jù)處理能力.這是大家都知道的.在perl本身有一個(gè)別的軟件沒(méi)有的小功能,就是Perl格式.它相當(dāng)于簡(jiǎn)單的命令行報(bào)表和圖表輸出
    2013-01-01
  • Perl中的真與假深入研究

    Perl中的真與假深入研究

    這篇文章主要介紹了Perl中的真與假深入研究,本文詳細(xì)講解了Perl中真值與假值的不同,需要的朋友可以參考下
    2015-06-06
  • 通過(guò)perl實(shí)現(xiàn)一個(gè)簡(jiǎn)單的NIDS

    通過(guò)perl實(shí)現(xiàn)一個(gè)簡(jiǎn)單的NIDS

    使用perl實(shí)現(xiàn)一個(gè)簡(jiǎn)單的NIDS,有需要的朋友可以參考下
    2013-02-02
  • Perl中的文件讀寫(xiě)學(xué)習(xí)筆記

    Perl中的文件讀寫(xiě)學(xué)習(xí)筆記

    這篇文章主要介紹了Perl中的文件讀寫(xiě)學(xué)習(xí)筆記,本文講解了打開(kāi)、關(guān)閉文件、讀文件、寫(xiě)文件、判斷文件狀態(tài)等內(nèi)容,需要的朋友可以參考下
    2015-02-02
  • 使用Perl生成隨機(jī)密碼

    使用Perl生成隨機(jī)密碼

    本文給大家分享的是使用perl生成隨機(jī)密碼的方法示例,而且可以通過(guò)參數(shù)來(lái)控制密碼中包含的字符種類(lèi),非常的不錯(cuò),有需要的小伙伴可以參考下
    2016-06-06
  • Perl初學(xué)筆記之Hello World

    Perl初學(xué)筆記之Hello World

    這篇文章主要介紹了Perl初學(xué)筆記之Hello World,本文是自學(xué)Perl的一篇筆記,本文著重講解了cpan的使用,需要的朋友可以參考下
    2015-06-06

最新評(píng)論

徐汇区| 宁陕县| 尼勒克县| 时尚| 溧阳市| 诸暨市| 宝山区| 南江县| 秦皇岛市| 沅陵县| 泸定县| 漯河市| 千阳县| 奉化市| 德州市| 射洪县| 和田县| 朔州市| 德州市| 辽阳市| 建瓯市| 沅陵县| 都安| 陈巴尔虎旗| 德昌县| 遂溪县| 龙山县| 和顺县| 蓝山县| 贡山| 安阳市| 南平市| 工布江达县| 凤城市| 买车| 宜良县| 重庆市| 博白县| 林口县| 鄂温| 平南县|