Сценарий:
У меня есть простая программа для передачи небольшого сообщения через интерфейс bcast на p2p-wlan0-0
на Linux. Ниже приведена программа.
Код:
#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);
if (ec) {
throw std::runtime_error(ec.message());
}
}
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);
if (ec) {
throw std::runtime_error(ec.message());
}
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;
}
Приемник является получателем l oop, получающим данные вслепую. И все это работает. Я могу отправлять и получать пакеты.
Проблема:
Но я теряю много пакетов через интерфейс вещания. Это как один из 10 пакетов получен. Я удивлен, потому что это p2p соединение. Мне требуется 10 трансляций, чтобы получить одно из них на стороне получателя. Действительно странно!
Так ли это должно работать по своей природе? Является ли UDP-вещание ненадежным? Или я ошибаюсь в настройке сокета UDP?