Поскольку мне кажется, что я не могу найти решение своей первоначальной проблемы, я попытался сделать небольшой обходной путь. Я просто пытаюсь установить время ожидания для вызова connect()
моего TCP-сокета.
- Я хочу, чтобы
connect()
блокировался, но не раньше обычного тайм-аута 75 секунд, я хочу определить свой собственный.
- Я уже попробовал
select()
, который работал в течение тайм-аута, но я не смог установить соединение (это была моя первоначальная проблема, как описано здесь ).
Так что теперь я нашел другой способ справиться с этим: просто выполните блокирующий вызов connect()
, но прервите его с помощью аварийного сигнала, подобного этому:
signal(SIGALRM, connect_alarm);
int secs = 5;
alarm(secs);
if (connect(m_Socket, (struct sockaddr *)&addr, sizeof(addr)) < 0 )
{
if ( errno == EINTR )
{
debug_printf("Timeout");
m_connectionStatus = STATUS_CLOSED;
return ERR_TIMEOUT;
}
else
{
debug_printf("Other Err");
m_connectionStatus = STATUS_CLOSED;
return ERR_NET_SOCKET;
}
}
с
static void connect_alarm(int signo)
{
debug_printf("SignalHandler");
return;
}
Это решение, которое я нашел в Интернете в потоке здесь в stackoverflow. Если я использую этот код, программа запускает таймер, а затем переходит в вызов connect()
. Через 5 секунд запускается обработчик сигнала (как видно на консоли с printf()
), но после этого программа все еще остается в функции connect()
в течение 75 секунд. Фактически каждое описание говорит, что connect_alarm()
должен прерывать функцию connect()
, но, похоже, в моем случае это не так. Есть ли способ получить желаемый результат для моей проблемы?