Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сокеты. Тайм-аут для функции connect()

563
21 ноября 2007 года
MrLinker
249 / / 17.09.2006
В случае, если порт закрыт, функция connect() по умолчанию долго думает.

Кто-нибудь знает как указать тайм-аут?
Или может есть другое решение?

С функцией получения имени по IP - gethostbyaddr() та же история.
563
22 ноября 2007 года
MrLinker
249 / / 17.09.2006
Спасибо большое. Всё понятно.

Я использую событийную модель и, соответственно, функцию WSAWaitForMultipleEvents().
В ней есть параметр TimeOut.
Только я лишь сейчас заметил, что он оказывает влияние :)

А как быть с gethostbyaddr() ?
Или может есть альтернативный способ?

Буду признателен еще раз :)
350
22 ноября 2007 года
cheburator
589 / / 01.06.2006
Цитата: MrLinker
А как быть с gethostbyaddr() ?
Или может есть альтернативный способ?



 
Код:
if (::setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&to, sizeof(to)) != 0)
    SocketSystem::ThrowError(); // Замени на свой код обработки ошибки
if (::setsockopt (sock, SOL_SOCKET, SO_SNDTIMEO, (const char*)&to, sizeof(to)) != 0)
    SocketSystem::ThrowError(); // Замени на свой код обработки ошибки

Примечание.
Работает только на блокирующих сокетах. Поскольку у тебя видимо используется WSAEventSelect, сокет у тебя неблокирующий, код работать не будет. Для неблокирующих сокетов выхода не вижу.
Я предпочитаю в таких случаях блокирующие сокеты, а чтобы recv не ждала пока придут данные, использую
 
Код:
u_long arg;
if (::ioctlsocket (sock, FIONREAD, &arg) != 0)
    SocketSystem::ThrowError();
// Здесь если arg != 0, на сокете есть данные для чтения (arg = число байт, которые можно прочитать), и можно вызывать recv - она не заблокирует поток


P. S. Поправка.
Сейчас дошло, что можно перед вызовом gethostbyaddr сделать сокет блокирующим, и установить нужный таймаут (setsockopt). после вызова gethostbyaddr вернуть все на место.
563
22 ноября 2007 года
MrLinker
249 / / 17.09.2006
Спасибо за много ценной информации!

Цитата:
P. S. Поправка.
Сейчас дошло, что можно перед вызовом gethostbyaddr сделать сокет блокирующим, и установить нужный таймаут (setsockopt). после вызова gethostbyaddr вернуть все на место.


Это вроде то, что нужно.
Однако, получить имя хоста по IP, либо, наоборот, IP по имени можно, не создав ни единого сокета. Забавно.

354
22 ноября 2007 года
ШпиЁн
468 / / 19.02.2006
можно отослать запрос на DNS сервер, написав собственную процедуру gethostbyaddr :-D
http://codeproject.com/internet/
563
22 ноября 2007 года
MrLinker
249 / / 17.09.2006
Жесть...

Интересно, а можно самому составить IP пакетик и послать в сеть (Т.е. указать все его поля самому)?
354
23 ноября 2007 года
ШпиЁн
468 / / 19.02.2006
есть библиотека winpcap для этих целей. на том же wasm.ru есть пример как выкинуть компутер из локалки, прислав ему неверный пакет. В интернете это, естесс, работать не будет :-D
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог