Raku UDP服务器如何知道发送响应到哪里?



我可以编写一个UDP服务器,它将使用IO::Socket::Async从客户端接收消息

my $socket = IO::Socket::Async.bind-udp: 'localhost', 3333;
react whenever $socket.Supply: :bin {
say "Received some junk: { .gist }";    
}

我可以发送东西到这个服务器:

given IO::Socket::Async.udp {
await .print-to: 'localhost', 3333, 'Hello';
}

但是当我试图让服务器发送回消息响应时,我意识到我没有发送它的主机和端口。我怎样才能得到这些信息?

通常,我认为这个问题的答案是使用recvfrom并将指针传递给sockaddr结构体,该结构体将使用传入连接的地址信息填充。但似乎没有办法做到这一点,而不达到原生的(即使这样,我也不清楚如何做到这一点)。

还是我错过了什么?

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;

显示:

Received client data: Can you hear me?
Received server data: Hi!
Received client data: Great :)

相关内容

  • 没有找到相关文章

最新更新