как получить IP-адрес входящего ICMP из-за UDP-отправки мертвому клиенту в Ruby? - PullRequest
0 голосов
/ 31 декабря 2010

итак .. Я делаю небольшую многопользовательскую игру с блокировкой UDP и IO.select. К моей проблеме .. (на сервере) чтение из сокета UDP (packet, sender = @socket.recvfrom(1000)), который только что отправил пакет мертвому клиенту, приводит к недоступности ICMP (и исключение Errno::ECONNRESET в ruby). Проблема в том, что я не могу найти какой-либо способ извлечь IP этого ICMP ... поэтому я могу удалить этот мертвый клиент.

Кто-нибудь знает, как этого добиться?

спасибо

Ответы [ 2 ]

1 голос
/ 31 декабря 2010

Вам нужно будет позвонить recvmsg для сокета и передать MSG_ERRQUEUE в качестве флага.

Исходный адрес назначения дейтаграммы, вызвавшей ошибку, передается через msg_name.

0 голосов
/ 01 января 2011

Стоит отметить, что исходный IP-адрес пакета ICMP не всегда будет совпадать с адресом вашего клиента. Источником может быть любой маршрутизатор, который обрабатывает пакеты для этого соединения, а полезная нагрузка пакета ICMP будет содержать заголовок IP + первые 8 байтов пакета, к которому он относится.

...