Доброго времени суток
Сталкиваюсь с переполнением очереди при отправке данных по 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???
udp