web-dev-qa-db-ja.com

C ++でUDPを介して文字列を送信する

文字列を送信したい:"Jane Doe"をイントラネットIPに192.168.0.4をポート9000にUDP経由で送信します。私はこれを何度もUDPとTCPで行いましたが、今では標準のC++ライブラリで行う必要があり、人々が作成できないトピックのみのサンプルを見つけることができません。それは動作します。

私は"Jane Doe"をバイトの配列としてエンコードし、ソケットを開いてデータグラムにパックして送信する必要があることを知っています。

C++は私の最初の言語ではなく、これは私が理解できないコードの一部です。UDPを選択したのは、TCPよりもずっと単純だからです。

15
Yoda

以下は、Unixコードのサンプルです。

これがWindowsプログラミングの場合:

  • "sock"はSOCKETではなくintタイプである必要があります。
  • closesocketの代わりにcloseを使用します
  • #include <winsock2.h>それらのすべての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

これは、boostライブラリを使用したい場合に非常に簡単です。

これがコードの抜粋です

#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