Клиент UDP с использованием Boost не всегда получает пакеты, хотя я вижу их в WiresharkC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Клиент UDP с использованием Boost не всегда получает пакеты, хотя я вижу их в Wireshark

Сообщение Anonymous »

Спасибо, кто не торопится, чтобы помочь мне с этим. Я пишу небольшую программу по эксплуатации мультироторного самолета через сообщения Mavlink. Дрон с автопилотом транслирует данные телеметрии через UDP и I, как клиент, должен прослушать его сообщения и отправлять некоторые из моих собственных. Проблема, которую у меня есть, заключается в том, что примерно в половине времени моя программа, по -видимому, не получает никаких пакетов от беспилотника. Я точно знаю, что проблема связана с моим кодом, поскольку я вижу все сообщения, отправленные автопилотом через UDP с помощью Wireshark. Другое программное обеспечение работает без проблем с тем же автопилотом на одном компьютере. Проблема где-то в моем приложении.

Код: Выделить всё

class UDPBase
{
public:
using IoContext = boost::asio::io_service; // backwards compatibility forces me to use an older boost
using UDP = boost::asio::ip::udp;
using Socket = UDP::socket;
using Endpoint = UDP::endpoint;
using Address = boost::asio::ip::address;
using ErrorCode = boost::system::error_code;

public:
UDPBase(IoContext &ioContext);
UDPBase(IoContext &ioContext, unsigned short int listenPort);
virtual ~UDPBase();

virtual void startListening();

void startIoContext();
void stopIoContext();

protected:
void init();
virtual void close();
void doListen();
virtual void onDataReceived(const ErrorCode &ec, unsigned char *buffer, size_t bufferSize);

private:

IoContext &ioContext;
Socket socket;
Endpoint listeningEndpoint;
Endpoint destinationEndpoint;
};
< /code>
listeningEndpoint
настроен с портом, который я слушаю. Я отредактировал несколько сеттеров и Getters, чтобы уменьшить размер кода.

Код: Выделить всё

UDPBase::UDPBase(IoContext &ioContext) : ioContext(ioContext), socket(ioContext)
{
init();
}

UDPBase::UDPBase(IoContext &ioContext, unsigned short int listenPort) : ioContext(ioContext), socket(ioContext)
{
// set listenEndpoint based on the port
init();
}

UDPBase::~UDPBase()
{
// close();
}

void UDPBase::startListening(unsigned short int listenPort)
{
init();
doListen();
}

void UDPBase::close()
{
socket.close();
}

void UDPBase::startIoContext()
{
ioContext.run();
}

void UDPBase::stopIoContext()
{
ioContext.post([this]()
{
if (socket.is_open())
{
socket.close();
}
});

ioContext.stop();
}

void UDPBase::doListen()
{
socket.async_receive_from(
boost::asio::buffer(receiveBuffer, maxBufferSize), listeningEndpoint,
[this](ErrorCode ec, std::size_t bytesRecvd)
{
// std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79562201/udp-client-using-boost-does-not-always-receive-packets-though-i-can-see-them-in[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»