LINUX.ORG.RU

Запись в неблокируемый udp сокет

 


0

1

Доброго времени суток

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

Посылай из отдельного треда, который блокируется.

mv ★★★★★
()

Предположим, что у тебя там асинхронный ввод/вывод с использованием select(). Один или несколько обработчиков хотят в текущий момент что-то отправить в свои файловые дескрипторы. Для таких обработчиков выставляешь ожидание на запись (для остальных НЕ выставляешь). Потом засыпаешь на select. Если файловые дескрипторы готовы принимать данные на запись, то пишешь в сокеты сколько надо (или сколько сможешь). Если что-то не смог отправить в этом цикле, отправишь в следующем. Снова засыпаешь на select() и ждешь, когда заполненные буферы освободятся.

Но если у тебя не редкие короткие сообщения, а длинные последовательности данных большого размера, то может лучше посмотреть в сторону TCP?

pathfinder ★★★★
()

можно ли так забивать сокет или нужно заново дергать select и FD_ISSET после каждого sendto???

select() вызываем, когда хотим дождаться наступления какого-то события по вводу/выводу. Если чего-то ждать не надо, то select() не вызываем.

pathfinder ★★★★
()
Ответ на: комментарий от anonymous

Макрос SOCKET_ERROR определен как -1 . sendto возвращает количество посланных байт или -1 при ошибке.

BlackJack
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.