Как лучше сделать неблокирующее чтение данных, приходящих по UDP?
общая идея — нужна некая функция read(), которая читает в буфер столько байт, сколько реально принято из сети, и возвращает это количество (включая 0 — если ничего не пришло).
1. использовать встроенную в winsock возможность
u_long mode = 1; // 1 to enable non-blocking socket
ioctlsocket(m_socketRecv, FIONBIO, &mode);
2. реализовать блокирующий сокет (который создается по умолчанию) в отдельном потоке и свой буфер (например циклический буфер с индексами чтения и записи), и сделать неблокирующее чтение принятых данных уже из этого буфера.
Как лучше? Какие преимущества и недостатки у обоих подходов?
Здравствуйте, 00011011, Вы писали:
0>Как лучше сделать неблокирующее чтение данных, приходящих по UDP?
Какой поток данных? Если до мегабита, то абсолютно пофиг.
0>общая идея — нужна некая функция read(), которая читает в буфер столько байт, сколько реально принято из сети, и возвращает это количество (включая 0 — если ничего не пришло).
Учтите, что UDP пакет нулевого размера это штатная возможность всех стеков.
0>1. использовать встроенную в winsock возможность 0>u_long mode = 1; // 1 to enable non-blocking socket 0>ioctlsocket(m_socketRecv, FIONBIO, &mode);
0>2. реализовать блокирующий сокет (который создается по умолчанию) в отдельном потоке и свой буфер (например циклический буфер с индексами чтения и записи), и сделать неблокирующее чтение принятых данных уже из этого буфера.
0>Как лучше? Какие преимущества и недостатки у обоих подходов?
Второй лучше переживёт всплески (напоминаю, на UDP нет ядерных механизмов гарантии доставки), но вводит лишние копирования. Можно гонять владеющие указатели на данные датаграмм, тогда будет перенос данных между кэшами процессоров/ядер.
Первый тупо проще и прямее, я бы начинал с него.
Здравствуйте, Слава, Вы писали:
С>Взять какую-нибудь готовую библиотеку, если вы пишете на С++/С. Или лезть в адовы бездны с IOCP/epoll и пулами потоков.
Да там все просто, зачем библиотеки? Протокол примитивный — это как-бы замена COM-порту для связи двух устройств, но по UDP. Один источник (устройство), один приемник (компьютер). Никакого интернета, никаких серверов.
Причем уже написано на потоке, но подумал — а зачем лишний поток и бессмысленные перепаковки между буферами, если в системе уже все эти буфера сделаны? Но вдруг есть подводные камни.