UDP广播丢失的数据包多于收到的数据包?

问题描述 投票:0回答:1

场景:我有一个简单的程序,可以通过Linux p2p-wlan0-0上的bcast接口广播一些消息。以下是程序。

代码:

#include <boost/asio.hpp>
#include <boost/system/error_code.hpp>

#include <iostream>
#include <memory>
#include <string>
#include <thread>

boost::asio::io_service ioService;
boost::asio::ip::udp::socket udpSocket = boost::asio::ip::udp::socket(ioService);
boost::asio::ip::udp::endpoint  endPoint;

void Prepare() {
    const int port = 36512; // Some port
    const std::string& broadcastIPAddress = "192.168.1.1";

    udpSocket.open(boost::asio::ip::udp::v4());
    udpSocket.set_option(boost::asio::socket_base::reuse_address(true));
    udpSocket.set_option(boost::asio::socket_base::broadcast(true));

    boost::asio::ip::address_v4 address =  boost::asio::ip::address_v4::from_string(broadcastIPAddress);
    boost::asio::ip::address_v4 broadcastAddressV4 = boost::asio::ip::address_v4::broadcast(address,
                                                    boost::asio::ip::address_v4::from_string("255.255.255.0")) ;
    endPoint = boost::asio::ip::udp::endpoint(broadcastAddressV4, port);
    boost::asio::ip::address interfaceIPAddress(boost::asio::ip::address_v4::from_string(broadcastIPAddress));
    boost::system::error_code ec;
    udpSocket.set_option(boost::asio::ip::multicast::outbound_interface(interfaceIPAddress.to_v4()), ec);
}

void Broadcast(const std::string& messageToBroadcast) {
    boost::system::error_code ec;
    udpSocket.send_to(boost::asio::buffer(messageToBroadcast.c_str(), messageToBroadcast.length()), endPoint, 0, ec);
    std::cout << "Broadcasted udp message " << messageToBroadcast << std::endl;
}

int main() {
    std::cout << "Program starts" << std::endl;
    std::atomic<bool> stopped{false};
    std::thread t([&stopped](){
        std::cout << "Broadcasting thread starting up" << std::endl;
        Prepare();
        do {
            Broadcast("hello");
            std::this_thread::sleep_for(std::chrono::seconds(1));
        } while(!stopped.load());
    });

    std::this_thread::sleep_for(std::chrono::minutes(1));
    stopped.store(true);
    t.join();

    std::cout << "Program ends" << std::endl;
}

接收器是一个盲目接收数据的接收循环。而且整个过程都有效。我能够发送和接收数据包。

问题:但是,我在广播接口上丢失了很多数据包。就像十分之一的数据包一样。我很惊讶,因为它是p2p连接。我需要进行10次广播,才能在接收器一侧收到一个广播。真奇怪!这是它应该如何工作的本质吗? UDP广播是否如此不可靠?还是我在设置UDP套接字的方式上发生了错误?

udp boost-asio embedded-linux broadcast
1个回答
0
投票

尽管设置了广播套接字选项,但192.168.1.1不是广播地址,而是单播地址。

尝试使用广播地址192.168.1.255255.255.255.255

© www.soinside.com 2019 - 2024. All rights reserved.