Неблокирующие сокеты
От: 00011011  
Дата: 12.03.21 12:59
Оценка:
Как лучше сделать неблокирующее чтение данных, приходящих по UDP?

общая идея — нужна некая функция read(), которая читает в буфер столько байт, сколько реально принято из сети, и возвращает это количество (включая 0 — если ничего не пришло).

1. использовать встроенную в winsock возможность
u_long mode = 1; // 1 to enable non-blocking socket
ioctlsocket(m_socketRecv, FIONBIO, &mode);

2. реализовать блокирующий сокет (который создается по умолчанию) в отдельном потоке и свой буфер (например циклический буфер с индексами чтения и записи), и сделать неблокирующее чтение принятых данных уже из этого буфера.

Как лучше? Какие преимущества и недостатки у обоих подходов?
Re: Неблокирующие сокеты
От: Слава  
Дата: 12.03.21 13:08
Оценка: -1
Здравствуйте, 00011011, Вы писали:

0>Как лучше? Какие преимущества и недостатки у обоих подходов?


Взять какую-нибудь готовую библиотеку, если вы пишете на С++/С. Или лезть в адовы бездны с IOCP/epoll и пулами потоков.

PS: Минусующим — мой ответ относится к "выполнить задачу". Если у автора темы есть желание поучиться, то второй совет про epoll тоже хорош.
Отредактировано 12.03.2021 13:13 Слава . Предыдущая версия .
Re: Неблокирующие сокеты
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 12.03.21 13:12
Оценка: 4 (1) +1
Здравствуйте, 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 нет ядерных механизмов гарантии доставки), но вводит лишние копирования. Можно гонять владеющие указатели на данные датаграмм, тогда будет перенос данных между кэшами процессоров/ядер.
Первый тупо проще и прямее, я бы начинал с него.
The God is real, unless declared integer.
Re[2]: Неблокирующие сокеты
От: 00011011  
Дата: 12.03.21 13:17
Оценка:
Здравствуйте, Слава, Вы писали:

С>Взять какую-нибудь готовую библиотеку, если вы пишете на С++/С. Или лезть в адовы бездны с IOCP/epoll и пулами потоков.


Да там все просто, зачем библиотеки? Протокол примитивный — это как-бы замена COM-порту для связи двух устройств, но по UDP. Один источник (устройство), один приемник (компьютер). Никакого интернета, никаких серверов.
Причем уже написано на потоке, но подумал — а зачем лишний поток и бессмысленные перепаковки между буферами, если в системе уже все эти буфера сделаны? Но вдруг есть подводные камни.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.