Windows: как нескольким процессам принимать данные с одного UDP порта? Как нескольким процессам в Windows одновременно принимать данные из одного UDP порта ? Подразумевается, что если на открытый UDP порт приходит датаграмма - то её получают сразу все процессы, у которых был bind данного порта. На сколько понятно из MSDN SO_REUSEADDR не используется с UDP сокетами и означает немного другое. Как реализовать такое поведение стандартным WinAPI без использования драйверов, LSP (layered service provider), и без необходимости поднимать процесс-ретранслятор - который получает пакеты с конкретного UDP порта и передаёт их остальным процессам ? без всего вот этого вот ? просто программка использующая windows api ?
В Windows нет специального механизма, который позволил бы нескольким процессам одновременно принимать данные из одного UDP порта. Однако можно реализовать это поведение с помощью механизма сокетов в Windows.
Один из способов - использовать множественную привязку сокетов к одному порту. Каждый процесс должен создать свой сокет UDP и привязать его к нужному порту. После этого используйте функцию setsockopt с параметром SO_REUSEADDR, чтобы разрешить множественную привязку сокетов к одному порту.
Каждый процесс должен иметь свой экземпляр сокета и привязать его к нужному порту с установленным параметром SO_REUSEADDR. Таким образом, все процессы смогут одновременно принимать данные из одного UDP порта.
В 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 порта.