2008年6月21日星期六

network programming start--a udp socket(网络编程初步--一个udp套字连接)

udp是一个面向字节流的网络连接协议,与tcp典型的不同是它不确保数据到达,不建立直接的联系。就像我们发信一样,发出去就不管了。

下面是一个建立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来创建打包格式的地址。

没有评论: