+ -
当前位置:首页 → 问答吧 → Perl UDP Server 如何区分客户端

Perl UDP Server 如何区分客户端

时间:2010-12-15

来源:互联网

本帖最后由 r_zack 于 2010-12-15 16:18 编辑

大家好,打听一下,用Perl做的UDP Server,在收到客户端A发来的消息和客户端B发来的消息后,如果想主动给客户端A发消息,要怎么做?

我是用如下代码生成socket:
  1. #!/usr/bin/perl
  2. use IO::Socket::INET;
  3. my $socket = IO::SOCKET::INET->new(
  4.     LocalPort => 90,
  5.     Proto => 'udp');
复制代码
并用如下代码读取内容:
  1. while(1) {
  2.     if ($socket->recv($buff, 1024, 0) {
  3.         ....
  4.         $socket->recv($buff, 1024,0);
  5.         ....
  6.     }
  7. }
复制代码
我从前只做过TCP Socket,因为可以$client = $socket->accept,所以随时可以方便的往客户端写东西,
最近看了骆驼书上粗浅的讲解后开始试验,后发现,TCP Socket的循环中可以一次循环只处理一个客户端,其他客户端通过fork来处理;
而UDP,我看了cpan上面IO::Socket::INET简陋的文档后完全搞不明白,看了网上的一些示例后才搞明白了如上的代码,可是发现UDP的读取方式不是“每个客户端都有不同的Socket”,而是服务端读取消息的时候使用“面向所有客户端”的socket,那如果像上面第二段代码中的两次读取中,分别受到了来自客户端A和客户端B的两条消息后,我想只对客户端A发送一段话,应该怎么做呢?

作者: r_zack   发布时间: 2010-12-15

既然udp是无连接的,你主动往对方发送消息不就行了。。
peeraddr ()这个方法可以得到对方地址。

作者: 兰花仙子   发布时间: 2010-12-15

本帖最后由 r_zack 于 2010-12-15 17:12 编辑

谢谢您,我之前从CPAN的文档看到这个函数了,也测试过了,我不明白的地方是,我要怎么给客户端发送消息?
我试过下面这个方法,可是客户端没有收到消息:
$peer = $socket->peeraddr;
$socket->send($text, 0, $peer);
是不是$peer还需要怎么加工一下?
我只知道$peer的位置应该是sockaddr_in格式的值,peeraddr产生的是这个格式的吗?

作者: r_zack   发布时间: 2010-12-15

本帖最后由 黑色阳光_cu 于 2010-12-15 17:26 编辑

recv的返回值

http://perldoc.perl.org/functions/recv.html

作者: 黑色阳光_cu   发布时间: 2010-12-15

搞定啦!谢谢大家!!
  1. $peer = $socket->recv($buff, 1024, 0);
  2. $socket->send("Thank you guys!", 0, $peer);
复制代码

作者: r_zack   发布时间: 2010-12-15

之前看send的文档时没注意,刚才才发现文档里有个链接
http://perldoc.perl.org/perlipc.html#UDP%3a-Message-Passing
早看到就好了……怪我太浮躁了

作者: r_zack   发布时间: 2010-12-15