好久没更新博客了,也好久没写关于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的原因,必须要保证他至少有一个字节的发送。
好了,文章如有不妥之处,还望各位多多指教。