下面是一个建立udp连接的客户端
#!/usr/bin/perl -w use strict; use IO::Socket; my $data; my $port = 2007; my $sock = IO::Socket::INET->new( Proto => 'udp', PeerHost => 'localhost', PeerPort => $port, ) or die "Can not socket: $!\n"; while (<STDIN>) { chomp; $sock->send("$_!") or die "send failed: $!\n"; $sock->recv( $data, 100 ) or die "recv failed: $!\n"; chomp $data; print $data, "\n"; } |
我们使用send来发送信息而使用recv函数来从服务器端读取反馈
在IO::Socket::New中指定了使用udp协议(Proto=>'udp')和服务器的地址(peerhost,peerport)
注意用到一个无限循环,其实完全没必要。
下面是udp服务器代码
1 #!/usr/bin/perl -w 2 3 use strict; 4 use IO::Socket; 5 use constant MAX_LEN => 5000; 6 7 my $port = 2007; 8 my $sock = IO::Socket::INET->new( 9 Proto => 'udp', 10 LocalPort => $port 11 ) or die "can not socket(): $!\n"; 12 print "Servicing incoming request.....\n"; 13 14 my ( $msg_in, $msg_out ); 15 while (1) { 16 next unless $sock->recv( $msg_in, MAX_LEN ); 17 18 # my $peerhost = gethostbyaddr($sock->peeraddr,AF_INET)||$sock->peerhost; 19 # my $peerport = $sock->peerport; 20 21 my $length = length($msg_in); 22 print "Client $peerhost:$peerport says: $msg_in\n"; 23 $msg_out = reverse $msg_in; 24 25 # my $host = sockaddr_in($peerport,inet_aton($peerhost)); 26 # $sock->send($msg_out,0,$host) or die "send failed: $!\n"; 27 28 $sock->send($msg_out) or die "send failed: $!\n"; 29 } 30 $sock->close; |
显然服务器需要绑定的是本机端口(LocalPort).
可以通过多重方法获得远端连接机器信息
send函数可以指定目的地址,此时需要使用sockaddr_in来创建打包格式的地址。

没有评论:
发表评论