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(); // Замени на свой код обработки ошибки
Сокеты. Тайм-аут для функции connect()
Кто-нибудь знает как указать тайм-аут?
Или может есть другое решение?
С функцией получения имени по IP - gethostbyaddr() та же история.
Я использую событийную модель и, соответственно, функцию WSAWaitForMultipleEvents().
В ней есть параметр TimeOut.
Только я лишь сейчас заметил, что он оказывает влияние :)
А как быть с gethostbyaddr() ?
Или может есть альтернативный способ?
Буду признателен еще раз :)
Цитата: MrLinker
А как быть с gethostbyaddr() ?
Или может есть альтернативный способ?
Или может есть альтернативный способ?
Код:
Примечание.
Работает только на блокирующих сокетах. Поскольку у тебя видимо используется WSAEventSelect, сокет у тебя неблокирующий, код работать не будет. Для неблокирующих сокетов выхода не вижу.
Я предпочитаю в таких случаях блокирующие сокеты, а чтобы recv не ждала пока придут данные, использую
Код:
u_long arg;
if (::ioctlsocket (sock, FIONREAD, &arg) != 0)
SocketSystem::ThrowError();
// Здесь если arg != 0, на сокете есть данные для чтения (arg = число байт, которые можно прочитать), и можно вызывать recv - она не заблокирует поток
if (::ioctlsocket (sock, FIONREAD, &arg) != 0)
SocketSystem::ThrowError();
// Здесь если arg != 0, на сокете есть данные для чтения (arg = число байт, которые можно прочитать), и можно вызывать recv - она не заблокирует поток
P. S. Поправка.
Сейчас дошло, что можно перед вызовом gethostbyaddr сделать сокет блокирующим, и установить нужный таймаут (setsockopt). после вызова gethostbyaddr вернуть все на место.
Цитата:
P. S. Поправка.
Сейчас дошло, что можно перед вызовом gethostbyaddr сделать сокет блокирующим, и установить нужный таймаут (setsockopt). после вызова gethostbyaddr вернуть все на место.
Сейчас дошло, что можно перед вызовом gethostbyaddr сделать сокет блокирующим, и установить нужный таймаут (setsockopt). после вызова gethostbyaddr вернуть все на место.
Это вроде то, что нужно.
Однако, получить имя хоста по IP, либо, наоборот, IP по имени можно, не создав ни единого сокета. Забавно.
можно отослать запрос на DNS сервер, написав собственную процедуру gethostbyaddr :-D
Интересно, а можно самому составить IP пакетик и послать в сеть (Т.е. указать все его поля самому)?
есть библиотека winpcap для этих целей. на том же wasm.ru есть пример как выкинуть компутер из локалки, прислав ему неверный пакет. В интернете это, естесс, работать не будет :-D