Доброго времени суток вам, народ!
столкнулся тут с проблемой сокетов, а именно с recv. Если я оставляю сокет блокируемым и ожидаю данные, то этот самый recv замораживает процесс пока не получит эти самые данные. Оно конечно и хорошо в некоторых случаях, но в моем случае случается так, что после успешного коннеста, клиент вылетает из сети, а сервер ждет этим самым recv обещенные данные и ясно дело не дожидается. Нашел выход из этой ситуации в установке таймаута на recv и использование select для слежения за сокетом. Ниже привожу исходник функции, которую использую...int vm_recive_socket (int soc, char rbuf[], int timeout)
{
long arg;
int sock,res,valopt;
struct timeval tv;
socklen_t lon;
fd_set myset;
struct sockaddr_in addr;
tv.tv_sec = timeout;
tv.tv_usec=0;
arg=fcntl(soc,F_GETFL,NULL);
arg |= O_NONBLOCK;
fcntl(soc, F_SETFL,arg);
res = recv(soc, rbuf, sizeof(rbuf), 0);
FD_ZERO (&myset);
FD_SET (soc,&myset);
if (select (soc+1,&myset,NULL,NULL,&tv)==0)
{
printf ("timeout\n");
return -100;
}
//?????????? ??????? ????? ??????
arg = fcntl(soc, F_GETFL, NULL);
arg&= (~O_NONBLOCK);
fcntl(soc, F_SETFL, arg);
return res;
}
С таймаутом у меня все получилось. Если во время соединения клиент не шлет данные, через указанное в timeout время, возвращается -100 и я знаю что произошло.. НО! Вниманияе вопрос Ж)) если приходят данные, функция возвращает отрицательное значение а strerror(errno) выдает ошибку "ERROR: Resource temporarily unavailable". Проверка переменной rbuf подтверждает то, что данные отсутствуют. Что я упустил? В чем ошибка?
P.S.
И еще.. Чуть не забыл. Объясните мне, пожалуйста, что сие означает? "arg&= (~O_NONBLOCK);"