gpt4 book ai didi

c++ - 高频接收UDP包 : packet loss?

转载 作者:太空狗 更新时间:2023-10-29 20:21:16 26 4
gpt4 key购买 nike

我有一个 C++ 应用程序,它使用 UDP 服务器(使用 Boost.Asio)以高频率(每秒 3500 个数据包)从千兆本地网络设备接收数据包。一些用户报告了一些数据包丢失。所以最后我选择并行运行 WireShark 和我的应用程序来检查是否有 WireShark 能够接收但我的应用程序不能接收的数据包。

我发现 WireShark 并没有收到每个数据包,它似乎遗漏了一些。我的应用程序还遗漏了一些 Wireshark 正确接收的帧。

我的问题:WireShark 是否可能获取我的应用程序未获取的数据包?我想也许 WireShark 对 IP 堆栈具有低级访问权限,并且即使在 WireShark 中显示数据包也会被操作系统丢弃?是否有可能 (1) 中的操作花费了太多时间,以至于下一个 async_receive_from 被调用得太晚了?我想就这个问题发表意见。谢谢。

这是我使用的代码(非常基本)。 udp_server.h :

#pragma once

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <fstream>

const int MAX_BUFFER_SIZE = 65537;

using boost::asio::ip::udp;

class UDPServer
{
public:
UDPServer(boost::asio::io_service& ios, udp::endpoint endpoint)
:m_io_service(ios),
m_udp_socket(m_io_service, endpoint)
{
// Resize the buffer to max size in the component property
m_recv_buffer.resize(MAX_BUFFER_SIZE);

m_output_file.open("out.bin", std::ios::out | std::ios::binary);

StartReceive();
}

public:
void StartReceive()
{
m_udp_socket.async_receive_from(
boost::asio::buffer(m_recv_buffer), m_remote_endpoint,
boost::bind(&UDPServer::HandleReceive, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}

private:
void HandleReceive(const boost::system::error_code& error, std::size_t bytes_transferred)
{
if (!error || error == boost::asio::error::message_size)
{
// Write to output -- (1)
m_output_file.sputn(&m_recv_buffer[0], bytes_transferred);

// Start to receive again
StartReceive();
}
}

boost::asio::io_service& m_io_service;
udp::socket m_udp_socket;
udp::endpoint m_remote_endpoint;
std::vector<char> m_recv_buffer;
std::filebuf m_output_file;
};

主要.cpp:

include <boost/asio.hpp>
#include "udp_server.h"

const unsigned short PORT_NUMBER = 44444;

int main()
{
boost::asio::io_service ios;
boost::asio::ip::udp::endpoint endpoint(udp::endpoint(udp::v4(), PORT_NUMBER));
UDPServer server(ios, endpoint);
ios.run();

return 0;
}

最佳答案

Is this possible that WireShark get a packet and that my application does not ?

是的。特别是,每个套接字都有自己的固定大小的传入数据缓冲区,如果在内核尝试将新传入数据包添加到该缓冲区时,缓冲区没有足够的可用空间来容纳该数据包,那么数据包不会添加到缓冲区,因此从该套接字读取传入数据的应用程序不会收到它。

鉴于此,WireShark 的缓冲区完全有可能有空间来接受传入的数据包,但您自己的应用程序的缓冲区却没有。

关于c++ - 高频接收UDP包 : packet loss?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44930288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com