Здравствуйте. Возникла проблема при работе с 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. В опциях самого винсока я не нашел настроек таймаута. Подскажите, пожалуйста, как быть?
А нет, я не прав. Конструкция помогла, но с одним нюансом. Прежде всего нужно было перевести сокет в неблокирующий режим. Вот такая конструкция решила мою проблему:
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 за наводку!
Использование неблокирующего сокета без надобности черезмерно. Посмотрите setsockopt про флаг SO_RCVTIMEO
. Тогда и при блокирующих input/output операциях будет использоваться тайм-аут.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Почему в данном коде последний элемент массива который передан функции inArray( [1,2,3,4,5] ) не добавляется в массив result ? Но если в конец массива...
У меня есть по сути два компонента с одной и той же логикой в методе componentWillReseiveProps и в некоторых методах еще Как мне применить наследование...
Из готовых решений что-то у меня не получается найтиА вообще было бы лучше своим кодом сделать