所以.. 我正在做一个阻止 UDP 和 IO.select 的小型多人游戏。对于我的问题..(在服务器中)从刚刚向死客户端发送数据包的 UDP 套接字()读取packet, sender = @socket.recvfrom(1000)
会导致 ICMP 无法访问(并且Errno::ECONNRESET
在 ruby 中出现异常)。问题是我找不到任何方法来提取该 ICMP 的 IP .. 所以我可以清除那个死客户端。
任何人都知道如何实现这一目标?
谢谢
所以.. 我正在做一个阻止 UDP 和 IO.select 的小型多人游戏。对于我的问题..(在服务器中)从刚刚向死客户端发送数据包的 UDP 套接字()读取packet, sender = @socket.recvfrom(1000)
会导致 ICMP 无法访问(并且Errno::ECONNRESET
在 ruby 中出现异常)。问题是我找不到任何方法来提取该 ICMP 的 IP .. 所以我可以清除那个死客户端。
任何人都知道如何实现这一目标?
谢谢
您需要调用recvmsg
套接字,并MSG_ERRQUEUE
作为标志传递。
导致错误的数据报的原始目标地址通过 msg_name 提供。
值得注意的是,ICMP 数据包的源 IP 地址并不总是与您的客户端相同。任何处理此连接的数据包的路由器都可能是源,ICMP 数据包的有效负载将包含 IP 标头 + 它相关的数据包的前 8 个字节。