我已经使用boost_asio
实现了udp_client udp_client :: recieve_from()如下所示。boost :: udp socket.recieve_from()将数据追加到缓冲区的末尾
void udp_client::recieve_from()
{
for(unsigned int i = 0; i < m_buffer_manager.get_recieve_array().size(); ++i)
m_buffer_manager.get_recieve_array()[i] = 0;
/*Initialize our endpoint*/
size_t len = m_socket.receive_from(
boost::asio::buffer(m_buffer_manager.get_recieve_array()), m_sender_endpoint);
m_buffer_manager.message_buffer(m_buffer_manager.get_recieve_array(),len);
std::cout << "Length of recieved message " << len << std::endl;
/*dumps the message into std::cout for debugging.*/
std::cout << m_buffer_manager.get_message_string() << std::endl;
//std::cout.write((const char*)&m_buffer_manager.get_recieve_array()[0], len);
packet_t ack_packet = { "ACK", {} };
auto buffer = ack_packet.serialize();
m_socket.send_to(boost::asio::buffer(buffer), m_endpoint);
}
udp_client.hpp
文件显示如下。
class udp_client
{
public:
udp_client(boost::asio::io_service& io_service,const std::string& host,const std::string& port);
~udp_client();
void subscribe();
void publish(const std::string& message);
void recieve_from();
private:
boost::asio::io_service& m_io_service;
boost::asio::ip::udp::udp::socket m_socket;
boost::asio::ip::udp::udp::endpoint m_endpoint;
boost::asio::ip::udp::endpoint m_sender_endpoint;
buffer_manager m_buffer_manager;
};
用于管理接收缓冲区的buffer_manager
对象如下所示。
class buffer_manager
{
public:
typedef boost::array<unsigned char, 4096> m_array_type;
buffer_manager();
~buffer_manager();
void message_buffer(m_array_type &recv_buf,size_t size);
buffer_manager::m_array_type & get_recieve_array();
std::string & get_message_string();
private:
std::string m_message;
m_array_type m_recv_buf;
};
我与udp_client :: recieve_from()代码的问题是,recieving一个分组之后
size_t len = m_socket.receive_from(boost::asio::buffer(m_buffer_manager.get_recieve_array()), m_sender_endpoint);
返回1个数据包。当它收到两个数据包时,它会收到整个两个数据包。 (第二分组的即内容被附加到所述第一数据包中的内容。)
这是
for(unsigned int i = 0; i < m_buffer_manager.get_recieve_array().size(); ++i)
m_buffer_manager.get_recieve_array()[i] = 0;
inspite其中I显式地清除缓冲区。这是什么原因?我该如何解决这个问题?
请在下面找到buffer_manager.cpp的实现。
#include <iostream>
#include <boost/array.hpp>
#include <boost/algorithm/hex.hpp>
#include <algorithm>
#include "buffer_manager.hpp"
buffer_manager::buffer_manager()
{
}
buffer_manager::~buffer_manager()
{
}
void buffer_manager::message_buffer(m_array_type &recv_buf,size_t size)
{
auto it = recv_buf.begin();
std::advance(it,size);
boost::algorithm::hex(recv_buf.begin(), it, back_inserter(m_message));
}
buffer_manager::m_array_type& buffer_manager::get_recieve_array()
{
return m_recv_buf;
}
std::string & buffer_manager::get_message_string()
{
return m_message;
}
我建议这个问题是不是与升压:: ASIO,但在缓冲区管理器字符串的管理。很难看到这个班级的实际意义。 – EJP
@EJP - 我有两个客户端,服务器实现。 (TCP和UDP).TCP和UDP客户端都使用buffer_manager来管理缓冲区。它是为数据抽象而创建的。我是C++的初学者。这是否有意义? – liv2hak
我不知道。向我们展示实施。它似乎没有做任何有用的字符数组尚未提供。 – EJP