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, чтобы разрешить множественную привязку сокетов к одному порту.
Пример кода:
#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
Каждый процесс должен иметь свой экземпляр сокета и привязать его к нужному порту с установленным параметром 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_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 порта.