Основной код последовательности я интересно это (псевдокод)Responsing на ICMP в выберите
sendto(some host); // host may be unreachable for now which is normal
...
if(select(readfs, timeout)) // there are some data to read
recvfrom();
С Win2000, ICMP пакет, который отправляется обратно после отправки UDP датаграммы недостижимым порт, триггеры выбора, после что recvfrom не удается с WSAECONNRESET. Такое поведение нежелательно для меня, потому что я хочу, чтобы в этом случае выбор заканчивался таймаутом (нет данных для чтения). В Windows это можно решить с помощью WSAIoctl SIO_UDP_CONNRESET (http://support.microsoft.com/kb/263823).
Мои вопросы:
- ли SIO_UDP_CONNRESET лучший способ в этой ситуации?
- Есть ли другие способы игнорировать ICMP для «select» или фильтровать его для recvfrom (возможно, игнорируя ошибку WSAECONNRESET в Windows, рассматривая ее как тайм-аут, может ли эта ошибка срабатывать в другом случае)?
- Существуют ли подобные проблемы для Linux и Unix (Solaris, OpenBSD)?
Вы будете использовать соединение только один раз? Если нет, как вы узнаете, когда закрыть соединение, если вы никогда не получите сообщение о том, что соединение больше неактивно и должно быть закрыто? –
Я хочу продолжить отправку дейтаграмм до тех пор, пока удаленный хост (на самом деле это некоторая встроенная система) не встанет или пользователь не прекратит это действие. – Yury
Я ударил эту ошибку при переносе приложения из Linux. В моем случае это неблокирующая передача датаграмм UDP, и я не хочу вообще закрывать соединение, если клиент умирает, я начинаю получать ошибки WSAECONNRESET на recv на сервере! Кажется, ошибка не ясна. Исправлено этим SIO_UDP_CONNRESET, но мне кажется, как ошибка в Winsock. – dashesy