2010-12-31 3 views
0

그래서 UDP와 IO.select를 차단하여 작은 멀티 플레이어 게임을하고 있습니다. 내 문제는 .. (서버에서) UDP 소켓 (packet, sender = @socket.recvfrom(1000))에서 방금 죽은 클라이언트에 패킷을 보내면 ICMP에 도달 할 수 없으며 (루비에서는 예외 Errno::ECONNRESET) 결과가 나타납니다. 문제는 그 ICMP의 IP를 추출하는 방법을 찾을 수 없다는 것입니다. 그래서 죽은 클라이언트를 제거 할 수 있습니다.루비에서 죽은 클라이언트로 UDP를 보내서 들어오는 ICMP의 IP를 얻으려면 어떻게해야합니까?

누구나이 방법을 알고 있습니까?

감사

답변

1

당신은 소켓 recvmsg를 호출해야하고, 플래그로 MSG_ERRQUEUE을 전달할 수 있습니다.

오류를 일으킨 데이터 그램의 원래 대상 주소는 msg_name을 통해 제공됩니다.

0

ICMP 패킷의 원본 IP 주소가 항상 클라이언트와 동일한 주소가되는 것은 아닙니다. 이 연결에 대한 패킷을 처리하는 모든 라우터가 소스가 될 수 있으며 ICMP 패킷의 페이로드에는 IP 헤더 + 관련 패킷의 처음 8 바이트가 포함됩니다.

관련 문제