我可以编写一个 UDP 服务器,它将使用 IO::Socket::Async 从客户端接收消息
my $socket = IO::Socket::Async.bind-udp: 'localhost', 3333;
react whenever $socket.Supply: :bin {
say "Received some junk: { .gist }";
}
Run Code Online (Sandbox Code Playgroud)
我可以将东西发送到该服务器:
given IO::Socket::Async.udp {
await .print-to: 'localhost', 3333, 'Hello';
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试让服务器发回消息响应时,我意识到我没有要发送消息的主机和端口。我怎样才能得到这些信息?
通常,我认为这个问题的答案是使用recvfrom并传递一个指向sockaddr结构的指针,该结构将填充传入连接的地址信息。但如果不使用 NativeCall 似乎就没有办法做到这一点(即使如此,我也不清楚如何做到这一点)。
或者我错过了什么?
TL;DR您的问题的解决方案是由 timo++ 实现的,以回应与您类似的 SO 问题,然后由 Kaiepi 在他们接受的答案中很好地记录。请相应地访问并投票。我在这里写的其余内容可以说是多余的。
官方文档没有提到解决方案(将:datagram参数传递给IO::Socket::Async.Supply方法)并使用您从供应中获得的Datagrams 。
以下是在两端使用低电平电源抽头的示例:
# Server
given IO::Socket::Async .bind-udp('localhost', 3333) {
.Supply(:datagram)
.tap: {
say "Received client data: { .data.gist }";
IO::Socket::Async.udp.print-to: .hostname, .port, 'Loud and clear!';
}
}
# Client
given IO::Socket::Async.udp {
.print-to: 'localhost', 3333, 'Can you hear me?';
.Supply
.tap: {
say "Received server data: { .gist }";
IO::Socket::Async.udp.print-to: 'localhost', 3333, 'Great :)';
}
}
sleep 1;
Run Code Online (Sandbox Code Playgroud)
显示:
Received client data: Can you hear me?
Received server data: Hi!
Received client data: Great :)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
193 次 |
| 最近记录: |