2013-05-09 83 views
2

我正在实现基于perl的UDP服务器/客户端模型。套接字函数recv()和send()用于服务器/客户端通信。似乎send()从recv()调用中获取返回地址,我只能让服务器回应发送初始请求的客户端。不过,我正在寻找服务器将数据发送给所有活动客户端,而不是仅发送源客户端。如果每个活动客户端的peer_address和peer_port是已知的,我怎样才能使用perl send()将数据包路由到特定的客户端? 一些尝试:Perl将UDP包发送给多个活动客户端

foreach (@active_clients) { 
    #$_->{peer_socket}->send($data); 
    #$socket->send($_->{peer_socket}, $data, 0, $_->{peer_addr}); 
    #send($_->{peer_socket}, $data, 0, $_->{peer_addr}); 
    $socket->send($data) #Echos back to source client 
} 

的Perldoc send简要介绍了参数的传递。我试图采用这种方法,结果是1)客户端只是接收套接字glob对象,或者2)从未收到数据包或者3)抛出错误。如何使用send()路由到已知客户端的任何示例都将非常感谢。

回答

3

是,只存储地址的某个地方,并回答他们:

# receiving some packets 
while (my $a = recv($sock, $buf, 8192, 0)) { 
    print "Received $buf\n"; 
    push @addrs, $a; 
    # exit at some point 
} 

# send the answers 
for my $a (@addrs) { 
    send($sock, "OK", 0, $a); 
} 
+0

谢谢伯努瓦。我打电话给recv有点不同: $ socket-> recv($ received_data,1024); 但是,使用您发布的方法,我能够成功捕获所有活动客户端并向他们广播消息。 – Burns 2013-05-12 21:59:44