Jump to content

one udp socket for read and write


photo

Recommended Posts

Posted

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

Posted

Для работы с 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-сокет может отправлять и получать данные от любых адресов, не требуя создания новых сокетов для каждого соединения.

×
×
  • Create New...