Я разрабатываю фильтр источника RTSP на C ++ и использую WINSOCK 2.0 - сокет блокировки.
Когда я создаю сокет блокировки, я устанавливаю его SO_RCVTIMEO
на 3 секунды, например:
int ReceiveTimeout = 3000;
int e = setsockopt(Socket, SOL_SOCKET, SO_RCVTIMEO, (char*)&ReceiveTimeout, sizeof(int));
Мой фильтр пытается подключиться к IP_ADDRESS:554
(554 - порт сервера RTSP).Если есть сервер, прослушивающий этот IP-адрес на порту 554, все идет хорошо, но:
Если мой фильтр создает сокет с существующим IP-адресом ,но на случайном порте, который никто не слушает, connect()
ждет 3 секунды и возвращает WSAETIMEDOUT
.Поэтому через 3 секунды я знаю, что предоставленный URL неверен.
Если мой фильтр создает сокет с несуществующим IP-адресом и пытается подключиться к нему, он висит около 10 секунд перед возвратом SOCKET_ERROR.Итак, SO_RCVTIMEO
игнорируется, если IP-адрес не существует в сети ...
ВОПРОС: Как установить время ожидания для несуществующегоIP, во втором случае?Нужно ли мне сначала отправлять ICMP PING, чтобы проверить, существует ли IP-адрес, или выполнить какую-либо другую проверку, подобную этой?
Любая помощь будет принята с благодарностью.Thanx.:)
ОТВЕТ НА МОЮ ПРОБЛЕМУ
Поскольку я использую блокирующие сокеты, вызывайте блоки connect()
, пока не будет установлено соединение, или соединение не будет установлено, потому чтохост не отвечает или отказывается от соединения.Если я установлю тайм-аут сокета на 3 секунды и попытаюсь подключиться к несуществующему хосту, мой компьютер (клиент) отправит TCP-пакет с установленным флагом SYN
, чтобы инициировать Threeway handshake ,Обычно хост, если он включен, ответит TCP-пакетом, содержащим установленные флаги ACK
и SYN
, а затем клиент (я) отправит TCP-пакет с установленным флагом ACK
.Затем соединение установлено.НО, если хост не работает и отправлено SYN
, клиент ждет, пока не истечет 3-секундный тайм-аут, а затем снова и снова пытается снова и снова, пока параметр реестра TcpMaxConnectRetransmissions
( MICROSOFT ARTICLE ) не станетдостигнут, потому что хост может быть UP, но пакет SYN
может быть потерян ... Моя Windows XP имеет эту настройку на 4, я думаю, поэтому каждый раз, когда он пытается отправить SYN
, он ждет 3 секунды, и когдачетвертая попытка не удалась, она возвращает SOCKET_ERROR
(через 12 секунд) и устанавливает WSAETIMEDOUT
в качестве последней ошибки WSA.
Обходной путь - использование неблокирующих сокетов и попытка вручную измерить соединениевремя попытки (потому что теперь connect()
не будет блокироваться), как предложил Мартин Джеймс.
Другой способ - возиться с реестром, который является последним средством ...