Доброго времени суток
Сталкиваюсь с переполнением очереди при отправке данных по udp.
сокет неблокируемый:
#ifdef WIN_API __uint32 iMode = 0; ioctlsocket(socket[i], FIONBIO, &iMode); #else __uint32 flag = fcntl(socket[i], F_GETFL, NULL); fcntl(socket, F_SETFL, flag & ~O_NONBLOCK); #endif
в бесконечном цикле вызываю // Проверка готовности дескрипторов сокетов if((nready = select(maxfd, &rset, &wset, NULL, &tv)) > 0) { цикл по всем используемым сокетам отправки
// Возможна запись в сокет
if(FD_ISSET(socket[i], &wset))
{
цикл по элементам очереди,пытаюсь отправлять данные пока не кончатся данные в очереди и нет ошибки записи в сокет if sendto(connection->socket, data, (int)size, 0, (struct sockaddr *)&connection->their_addr, (int) sizeof (struct sockaddr))) == SOCKET_ERROR) break; }
Последнее решение вызывает сомнение: можно ли так забивать сокет или нужно заново дергать select и FD_ISSET после каждого sendto???