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
相关产品推荐
相关产品推荐

