iOS - пинг с таймаутом - PullRequest
       12

iOS - пинг с таймаутом

10 голосов
/ 16 сентября 2011

Я использую пример Apple "Simple Ping", и в нем есть почти все функции, которые мне нужны, но я не знаю, где я могу установить время ожидания каждого пакета.Кажется, что это невозможно, потому что функция, которая используется для записи данных в сокет, не имеет параметров времени ожидания.Кто-нибудь есть идея изменить это приложение, чтобы получить возможность установить время ожидания, как в команде Windows Ping?Под тайм-аутом я подразумеваю время для каждого отправленного пакета, который будет отброшен после ожидания слишком длинного ответа.

Команда Windows ping - время ожидания, которое мне нужно иметь:

"- w Время ожидания: указывает количествовремя ожидания в миллисекундах для получения сообщения эхо-ответа, соответствующего данному сообщению эхо-запроса. Если сообщение эхо-ответа не было получено в течение времени ожидания, отображается сообщение об ошибке «Время ожидания истекло».время ожидания по умолчанию - 4000 (4 секунды). "

Простой код Ping, который я использую: http://developer.apple.com/library/mac/#samplecode/SimplePing/Introduction/Intro.html

Ответы [ 2 ]

15 голосов
/ 16 сентября 2011

Пример кода Apple:

bytesSent = sendto(
    CFSocketGetNative(self->_socket),
    sock,
    [packet bytes],
    [packet length], 
    0, 
    (struct sockaddr *) [self.hostAddress bytes], 
    (socklen_t) [self.hostAddress length]
);

чтобы изменить время ожидания:

CFSocketNativeHandle sock = CFSocketGetNative(self->_socket);
struct timeval tv;
tv.tv_sec  = 0;
tv.tv_usec = 100000; // 0.1 sec
setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, sizeof(tv));

bytesSent = sendto(
    sock,
    [packet bytes],
    [packet length], 
    0, 
    (struct sockaddr *) [self.hostAddress bytes], 
    (socklen_t) [self.hostAddress length]
);

См. Документы Apple: setsockopt

Из вышеупомянутого документа:
SO_SNDTIMEO - это опция для установки значения времени ожидания для операций вывода. Он принимает параметр struct timbal с количеством секунд и микросекунд, используемых для ограничения времени ожидания завершения операций вывода. Если операция отправки заблокирована в течение этого времени, она возвращается с частичным счетом или с ошибкой EWOULDBLOCK, если данные не были отправлены. В текущей реализации этот таймер перезапускается каждый раз, когда в протокол доставляются дополнительные данные, подразумевая, что ограничение применяется к выходным частям, размер которых варьируется от отметки низкого уровня до отметки верхнего уровня для вывода.

0 голосов
/ 10 января 2013

например:

tv.tv_sec = 0;

tv.tv_usec = 1000;

setsockopt (recv_sock, SOL_SOCKET, SO_RCVTIMEO, (char *) & tv,sizeof (struct timeval));

setsockopt (send_sock, SOL_SOCKET, SO_SNDTIMEO, (char *) & tv, sizeof (struct timeval));

для дополнительных опций:

http://developer.apple.com/library/ios/#documentation/system/conceptual/manpages_iphoneos/man2/setsockopt.2.html

...