2

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

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() 路由到已知客户端的示例都将不胜感激。

4

1 回答 1

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);
}
于 2013-05-12T18:25:24.870 回答