web-dev-qa-db-fra.com

Envoi de chaîne sur UDP en C ++

Je souhaite envoyer une chaîne: "Jane Doe" vers l'IP intranet 192.168.0.4 au port 9000 sur UDP. Je l'ai fait plusieurs fois via UDP et TCP par Java, mais maintenant je dois le faire avec les bibliothèques C++ standard et je ne peux pas trouver d'exemples uniquement des sujets où les gens ne peuvent tout simplement pas faire ça marche.

Je sais que je dois encoder "Jane Doe" en tant que tableau d'octets, puis ouvrez simplement le socket, placez-le dans le datagramme et envoyez-le.

C++ n'est pas ma première langue et c'est une petite partie du code que je ne peux pas comprendre, j'ai choisi UDP parce qu'il est toujours beaucoup plus simple que TCP.

15
Yoda

Voici un exemple de code Unix.

S'il s'agit de la programmation Windows:

  • "sock" doit être de type SOCKET au lieu de int.
  • Utilisez closesocket au lieu de close
  • #include <winsock2.h> au lieu de tous ces en-têtes Unix

#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <memory.h>
#include <ifaddrs.h>
#include <net/if.h>
#include <errno.h>
#include <stdlib.h>
#include <iostream>


int resolvehelper(const char* hostname, int family, const char* service, sockaddr_storage* pAddr)
{
    int result;
    addrinfo* result_list = NULL;
    addrinfo hints = {};
    hints.ai_family = family;
    hints.ai_socktype = SOCK_DGRAM; // without this flag, getaddrinfo will return 3x the number of addresses (one for each socket type).
    result = getaddrinfo(hostname, service, &hints, &result_list);
    if (result == 0)
    {
        //ASSERT(result_list->ai_addrlen <= sizeof(sockaddr_in));
        memcpy(pAddr, result_list->ai_addr, result_list->ai_addrlen);
        freeaddrinfo(result_list);
    }

    return result;
}


int main()
{
    int result = 0;
    int sock = socket(AF_INET, SOCK_DGRAM, 0);

    char szIP[100];

    sockaddr_in addrListen = {}; // zero-int, sin_port is 0, which picks a random port for bind.
    addrListen.sin_family = AF_INET;
    result = bind(sock, (sockaddr*)&addrListen, sizeof(addrListen));
    if (result == -1)
    {
       int lasterror = errno;
       std::cout << "error: " << lasterror;
       exit(1);
    }


    sockaddr_storage addrDest = {};
    result = resolvehelper("192.168.0.4", AF_INET, "9000", &addrDest);
    if (result != 0)
    {
       int lasterror = errno;
       std::cout << "error: " << lasterror;
       exit(1);
    }

    const char* msg = "Jane Doe";
    size_t msg_length = strlen(msg);

    result = sendto(sock, msg, msg_length, 0, (sockaddr*)&addrDest, sizeof(addrDest));

    std::cout << result << " bytes sent" << std::endl;

    return 0;

}
17
selbie

C'est très facile à faire si vous êtes prêt à utiliser la bibliothèque boost.

Voici l'extrait de code

#include "boost/asio.hpp"
using namespace boost::asio;

...

io_service io_service;
ip::udp::socket socket(io_service);
ip::udp::endpoint remote_endpoint;

socket.open(ip::udp::v4());

remote_endpoint = ip::udp::endpoint(ip::address::from_string("192.168.0.4"), 9000);

boost::system::error_code err;
socket.send_to(buffer("Jane Doe", 8), remote_endpoint, 0, err);

socket.close();
12
James Wierzba