Yakovlev Posted August 18 Posted August 18 how to open udp socket on specific ip-addr:port and how to send data to other specific ip-addr:port, using one socket, not two
Didgik Posted August 19 Posted August 19 Для работы с UDP-сокетами в Windows (MSVC) используется Winsock2. Вот пример, как открыть UDP-сокет на конкретном IP и порту, и отправить данные на другой адрес через тот же сокет: #include <winsock2.h> #include <ws2tcpip.h> #include <iostream> #include <string> #pragma comment(lib, "ws2_32.lib") int main() { // Инициализация Winsock WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { std::cerr << "WSAStartup failed\n"; return 1; } // 1. Создание UDP-сокета SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sock == INVALID_SOCKET) { std::cerr << "Socket creation failed: " << WSAGetLastError() << "\n"; WSACleanup(); return 1; } // 2. Привязка к конкретному локальному IP и порту sockaddr_in localAddr{}; localAddr.sin_family = AF_INET; localAddr.sin_port = htons(12345); // Локальный порт inet_pton(AF_INET, "192.168.1.100", &localAddr.sin_addr); // Локальный IP if (bind(sock, (sockaddr*)&localAddr, sizeof(localAddr)) == SOCKET_ERROR) { std::cerr << "Bind failed: " << WSAGetLastError() << "\n"; closesocket(sock); WSACleanup(); return 1; } // 3. Отправка данных на другой IP и порт через тот же сокет sockaddr_in destAddr{}; destAddr.sin_family = AF_INET; destAddr.sin_port = htons(54321); // Удаленный порт inet_pton(AF_INET, "192.168.1.200", &destAddr.sin_addr); // Удаленный IP const char* message = "Hello UDP!"; int bytesSent = sendto( sock, message, strlen(message), 0, (sockaddr*)&destAddr, sizeof(destAddr) ); if (bytesSent == SOCKET_ERROR) { std::cerr << "Send failed: " << WSAGetLastError() << "\n"; } else { std::cout << "Sent " << bytesSent << " bytes\n"; } // 4. Закрытие сокета closesocket(sock); WSACleanup(); return 0; } **Ключевые моменты:** - `socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)` — создает UDP-сокет - `bind()` — привязывает сокет к локальному IP и порту - `sendto()` — отправляет данные на указанный адрес, используя тот же сокет - Для получения данных используется `recvfrom()` Один UDP-сокет может отправлять и получать данные от любых адресов, не требуя создания новых сокетов для каждого соединения.
Recommended Posts