You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Raku UDP服务器如何获取客户端地址以发送响应?

在Raku的IO::Socket::Async中获取UDP客户端地址并发送响应

你不需要借助NativeCall实现,IO::Socket::Async本身就封装了获取客户端地址的能力——问题出在你使用:bin参数调用.Supply时,只会返回接收到的二进制数据;而默认情况下(不带:bin),.Supply会返回一个Pair,其中键是接收到的二进制数据(Blob),值是客户端的SocketAddress对象,包含主机和端口信息。

修改后的UDP服务器代码如下,既能接收消息,也能获取客户端地址并发送响应:

my $socket = IO::Socket::Async.bind-udp: 'localhost', 3333;

react whenever $socket.Supply {
    my ($data, $client-addr) = .kv;
    my $message = $data.decode('utf-8');
    say "Received from {$client-addr.host}:{$client-addr.port}: $message";
    
    # 向客户端发送响应
    await $socket.print-to($client-addr, "Got your message: $message");
}

对应的客户端代码可以保持不变,若需要接收服务器响应,可做如下调整:

given IO::Socket::Async.udp {
    await .print-to: 'localhost', 3333, 'Hello from client';
    
    # 接收服务器响应
    whenever .Supply -> $resp {
        say "Server response: {$resp.key.decode('utf-8')}";
        done; # 收到响应后退出react块
    }
}

关键说明:

  • SocketAddress对象提供.host和.port方法,可直接获取客户端的主机地址和端口号。
  • 使用$socket.print-to($client-addr, $response)即可直接向客户端发送响应,无需手动拼接主机和端口。
  • 若需处理二进制数据,无需使用:bin参数,直接从Pair的键中获取Blob即可进行后续操作。

内容的提问来源于stack exchange,提问作者jja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:37:15