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

22 Сен 2023 в 19:53
48 +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_REUSEADDR
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
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 436 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир