Windows: как нескольким процессам принимать данные с одного UDP порта? Как нескольким процессам в Windows одновременно принимать данные из одного UDP порта ? Подразумевается, что если на открытый UDP порт приходит датаграмма - то её получают сразу все процессы, у которых был bind данного порта. На сколько понятно из MSDN SO_REUSEADDR не используется с UDP сокетами и означает немного другое. Как реализовать такое поведение стандартным WinAPI без использования драйверов, LSP (layered service provider), и без необходимости поднимать процесс-ретранслятор - который получает пакеты с конкретного UDP порта и передаёт их остальным процессам ? без всего вот этого вот ? просто программка использующая windows api ?

22 Сен 2023 в 19:53
45 +1
0
Ответы
1

В Windows нет специального механизма, который позволил бы нескольким процессам одновременно принимать данные из одного UDP порта. Однако можно реализовать это поведение с помощью механизма сокетов в Windows.

Один из способов - использовать множественную привязку сокетов к одному порту. Каждый процесс должен создать свой сокет UDP и привязать его к нужному порту. После этого используйте функцию setsockopt с параметром SO_REUSEADDR, чтобы разрешить множественную привязку сокетов к одному порту.

Пример кода:

#include <Winsock2.h>
#include <Ws2tcpip.h>
#include <iostream>
int main(

WSADATA wsaData
WSAStartup(MAKEWORD(2,2), &wsaData)
// Создание сокет
SOCKET udpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
if (udpSocket == INVALID_SOCKET

std::cerr << "Error creating socket" << std::endl
return 1

// Установка параметра SO_REUSEADD
BOOL reuse = TRUE
if (setsockopt(udpSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)) == SOCKET_ERROR

std::cerr << "Error setting SO_REUSEADDR option" << std::endl
closesocket(udpSocket)
WSACleanup()
return 1

// Привязка сокета к порт
sockaddr_in addr
addr.sin_family = AF_INET
addr.sin_port = htons(1234)
addr.sin_addr.s_addr = htonl(INADDR_ANY)
if (bind(udpSocket, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR

std::cerr << "Error binding socket" << std::endl
closesocket(udpSocket)
WSACleanup()
return 1

// Принимаем данны
char buffer[1024]
int recvResult = recvfrom(udpSocket, buffer, sizeof(buffer), 0, NULL, NULL)
if (recvResult == SOCKET_ERROR

std::cerr << "Error receiving data" << std::endl
closesocket(udpSocket)
WSACleanup()
return 1

std::cout << "Received data: " << buffer << std::endl
closesocket(udpSocket)
WSACleanup()
return 0
}

Каждый процесс должен иметь свой экземпляр сокета и привязать его к нужному порту с установленным параметром SO_REUSEADDR. Таким образом, все процессы смогут одновременно принимать данные из одного UDP порта.

16 Апр в 15:59
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 90 663 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир