perl进行socket编程

      好久没更新博客了,也好久没写关于perl的文章了,blog的更新对我来说要看心情的,心血来潮我会 写很多的,呵呵,不说废话了。

       socket编程,我想学过网络编程基本上都会,所以,虚的东西我也就不说了,直接看代码:

   客户端:

#!/usr/bin/perl -w
use Socket;
use IO::Handle;
socket(SOCK,AF_INET,SOCK_STREAM,getprotobyname("tcp"));

my $addr=sockaddr_in(3000,inet_aton("localhost"));
connect(SOCK,$addr);
SOCK->autoflush(1);
$buff=<SOCK>;
STDOUT->autoflush(1);
print $buff;
while(1){
$in=<STDIN>;   
send(SOCK,$in,0);
while(my $l=sysread(SOCK,$buff,100)){
if($buff=~/bye/i){
close SOCK;
 exit 0;
}
 print $buff;
 last if $l<100;
}

}

服务端:

#!/usr/bin/perl -w
use Socket;
use IO::Handle;
socket(SOCK,AF_INET,SOCK_STREAM,getprotobyname("tcp"));
setsockopt(SOCK,SOL_SOCKET,SO_REUSEADDR,1);
my $addr=sockaddr_in(3000,INADDR_ANY);
bind(SOCK,$addr);

listen(SOCK,SOMAXCONN);
    
while(1){
 next unless my $addr1=accept(S,SOCK);
 
 S->autoflush(1);
 STDOUT->autoflush(1);
 print S "welcome/n";
 while(<S>){
  print $_;
  chomp;
  if($_=~/^quit/i){
  print S "bye";
  close S;
  close SOCK;
   exit 0;
  }
  print S scalar(`$_`)."/n";  
 }
 
 close S;
}

代码应该很好懂,要说明下是我看见许多perl资料里说while(<SOCK>)来读取信息,我试验证明了,读一次是可以的,但是不能放在while循环里,因为<>这个符号在读取文件或者管道是是遇到换行或者EOF才结束的,所以,当没有遇到换行或者EOF时会一直等待下去,我不清楚如何在perl里发送EOF,所以用while的话会一直等待下去,等待对方发送信息过来,也就是死锁。因此我在这里吧代码换成了

while(my $l=sysread(SOCK,$buff,100)){
if($buff=~/bye/i){
close SOCK;
 exit 0;
}
 print $buff;
 last if $l<100;
}

sysread是个好东西,他会尽可能读取东西,最多读取你设置的最大数,最好读取一个字节,而不会像《》或者read一样一只等待下去,这也就是我为什么在print S scalar(`$_`)."/n";  
药加个/n的原因,必须要保证他至少有一个字节的发送。

          好了,文章如有不妥之处,还望各位多多指教。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值