【问题标题】:how do I get the IP of incoming ICMP due to UDP-send to dead client in Ruby?由于 UDP 发送到 Ruby 中的死客户端,如何获取传入 ICMP 的 IP?
【发布时间】:2011-01-02 02:33:12
【问题描述】:
所以.. 我正在做一个阻止 UDP 和 IO.select 的小型多人游戏。对于我的问题..(在服务器中)从刚刚向死客户端发送数据包的 UDP 套接字(packet, sender = @socket.recvfrom(1000))读取会导致 ICMP 无法访问(以及 ruby 中的异常 Errno::ECONNRESET)。问题是我找不到任何方法来提取该 ICMP 的 IP。所以我可以清除那个死客户端。
有人知道如何实现吗?
谢谢
【问题讨论】:
标签:
ruby
networking
udp
icmp
【解决方案1】:
您需要为套接字调用recvmsg,并将MSG_ERRQUEUE 作为标志传递。
导致错误的数据报的原始目标地址是通过 msg_name 提供的。
【解决方案2】:
值得注意的是,ICMP 数据包的源 IP 地址并不总是与您的客户端相同。任何处理此连接的数据包的路由器都可能是源,ICMP 数据包的有效负载将包含 IP 标头 + 它相关的数据包的前 8 个字节。