« Perl Socket 编程样例(1) | Main | Mailing List (邮件列表)原理简述及我的perl实现 »
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明。
本文网址:http://www.hzqbbc.com/blog/arch/2005/06/perl_socket_cca_1.html
June 03, 2005
Perl Socket 编程样例(2)
前两天介绍了使用Socket及IO::Socket 来进行TCP client/server的编程基本套路和代码,现在再介绍使用Socket及IO::Socket模块来进行Unix domain Socket的client/server开发。
Unix Domain Socket(简称unix socket)和TCP/UDP等INET类型socket相比起来有几个优点:- 安全性高,unix socket只在单机环境中使用,不支持机器之间通信
- 效率高,执行时的速度约是TCP的两倍,多用于操作系统内部通信(IPC)
- 支持SOCK_DGRAM,但和UDP不同,前后消息是严格有序的
因此使用Unix socket来设计单机的IPC应用是首选。非常实用。大量的Unix应用软件都使用unix socket来进行程序间通信。
Unix Domain Socket客户端, Socket模块
简介:使用Unix domain socket的客户端。
#!/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 服务端, Socket模块
简介:使用Unix domain socket实现的daytime服务器。
#!/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;
...to be continued
Posted by hzqbbc at June 3, 2005 09:00 AM
Comments
你好,看到你的这边帖子,对我的帮助很大。
因为没有怎么接触过Perl和Socket编程,所以请教一个可能很弱的问题。
客户端怎么给服务器端发送变量?服务器端怎么接收呢?
期待你的回复,谢谢。
如果可能,请顺便给我Mail:yhsmengdi@sohu.com
Posted by: yhsmengdi at June 6, 2006 02:03 PM