Winsock timeout

182
14 апреля 2018, 20:26

Здравствуйте. Возникла проблема при работе с Winsock - в частности, не могу выставить время таймаута коннекта. Читал, что это можно сделать, переведя его в неблокирующий режим и выставить нужный параметр через select(), но это не дало никаких результатов. Пытался сделать следующим образом

    timeval time_out;
time_out.tv_sec = 5;
time_out.tv_usec = 0; //5 sek
fd_set setW, setE;
FD_ZERO(&setW);
FD_SET(sock, &setW);
FD_ZERO(&setE);
FD_SET(sock, &setE);
int ierr1=12;
ierr1 = select(0, NULL, &setW, &setE, &time_out);
ierr1 = FD_ISSET(sock, &setW);

но при попытке законектится - сокет возвращает -1. В опциях самого винсока я не нашел настроек таймаута. Подскажите, пожалуйста, как быть?

Answer 1

А нет, я не прав. Конструкция помогла, но с одним нюансом. Прежде всего нужно было перевести сокет в неблокирующий режим. Вот такая конструкция решила мою проблему:

unsigned long nonblocking;
int status = ioctlsocket(sock, FIONBIO, &nonblocking);
int socket_status = ::connect(sock,(sockaddr *)&fpga_addr,sizeof(fpga_addr)) ;
if(socket_status == SOCKET_ERROR)
{
    int iError = WSAGetLastError();
    if(iError == WSAEWOULDBLOCK)
    {
        fd_set Write, Err;
        TIMEVAL Timeout;
        int TimeoutSec = 4; // timeout after 10 seconds
        FD_ZERO(&Write);
        FD_ZERO(&Err);
        FD_SET(sock, &Write);
        FD_SET(sock, &Err);
        Timeout.tv_sec = TimeoutSec;
        Timeout.tv_usec = 0;
        int timeout_status = select(0,          //ignored
            NULL,       //read
            &Write, //Write Check
            &Err,       //Error Check
            &Timeout);
        if(timeout_status == 0)
        {
            return 0;
        }
        else
        {
            if(FD_ISSET(sock, &Write))
            {
                return sock;
            }
        }
    }
    else 
    {
        return 0;
    }
}

Спасибо @goldstar_labs за наводку!

Answer 2

Использование неблокирующего сокета без надобности черезмерно. Посмотрите setsockopt про флаг SO_RCVTIMEO. Тогда и при блокирующих input/output операциях будет использоваться тайм-аут.

READ ALSO
Последний элемент массива в js

Последний элемент массива в js

Почему в данном коде последний элемент массива который передан функции inArray( [1,2,3,4,5] ) не добавляется в массив result ? Но если в конец массива...

161
Наследование в реакт?

Наследование в реакт?

У меня есть по сути два компонента с одной и той же логикой в методе componentWillReseiveProps и в некоторых методах еще Как мне применить наследование...

129
Как сделать подобный слайдер? [требует правки]

Как сделать подобный слайдер? [требует правки]

Из готовых решений что-то у меня не получается найтиА вообще было бы лучше своим кодом сделать

117