Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost asio tcp异步读/写_C++_Boost_Tcp_Boost Asio - Fatal编程技术网

C++ boost asio tcp异步读/写

C++ boost asio tcp异步读/写,c++,boost,tcp,boost-asio,C++,Boost,Tcp,Boost Asio,我理解boost asio如何处理这一问题: 当我在客户端查看请求响应时,我可以使用下面的boost示例 但是我不明白如果服务器每X毫秒向客户端发送一些状态信息会发生什么。我是否为此打开了一个Seroperate套接字,或者我的客户端是否可以区分请求、响应和cycleMessage 客户端是否会发送请求并将其读取为cycleMessage?因为他也因为这个消息在等待异步读取 类TcpConnectionServer:public boost::从\u中启用\u共享\u { 公众: typed

我理解boost asio如何处理这一问题:

当我在客户端查看请求响应时,我可以使用下面的boost示例

但是我不明白如果服务器每X毫秒向客户端发送一些状态信息会发生什么。我是否为此打开了一个Seroperate套接字,或者我的客户端是否可以区分请求、响应和cycleMessage

客户端是否会发送请求并将其读取为cycleMessage?因为他也因为这个消息在等待异步读取


类TcpConnectionServer:public boost::从\u中启用\u共享\u
{
公众:
typedef boost::共享_ptr指针;
静态指针创建(boost::asio::io_服务和io_服务)
{
返回指针(新的TcpConnectionServer(io_服务));
}
boost::asio::ip::tcp::socket和socket()
{
返回m_插座;
}
void Start()
{
SendCycleMessage();
boost::asio::异步读取(
m_套接字,boost::asio::buffer(m_数据,m_数据大小),
boost::bind(&TcpConnectionServer::handle_read_data,shared_from_this(),boost::asio::placeholders::error));
}
私人:
TcpConnectionServer(boost::asio::io_服务和io_服务)
:m_套接字(io_服务),m_循环更新(io_服务,boost::posix_时间::秒(1))
{
}
无效句柄读取数据(常量boost::系统::错误代码和错误代码)
{
如果(!错误代码)
{
std::string answer=doSomeThingWithData(m_数据);
书面答复;
boost::asio::异步读取(
m_套接字,boost::asio::buffer(m_数据,m_数据大小),
boost::bind(&TcpConnectionServer::handle_read_data,shared_from_this(),boost::asio::placeholders::error));
}
其他的
{
std::coutwrite();
}
无效写入()
{
m_message=m_messageOutputQueue[0];
boost::asio::异步写入(
m_插座,
boost::asio::buffer(m_消息),
boost::bind(&TcpConnectionServer::writeHandler,this,boost::asio::placeholders::error,
boost::asio::占位符::字节(已传输);
}
void writeHandler(const boost::system::error\u code&error,const size\u t bytesttransfered)
{
m_messageOutputQueue.pop_front();
如果(错误)
{

消息的区别是应用程序协议的一部分

ASIO只提供交通工具

现在,如果你想要一个“keepalive”消息,你必须设计你的协议,这样客户端才能区分消息

诀窍是从更高的层次来考虑。不要直接在客户端上处理
async_-read
。相反,让
async_-read
将消息放在一个队列(或多个队列;状态消息甚至不能放在一个队列中,而是取代以前未处理的状态更新,例如)

然后根据这些队列对客户机进行编码

通常要做的一件简单的事情是引入消息框架和消息类型id:

FRAME offset 0: message length(N)
FRAME offset 4: message data
FRAME offset 4+N: message checksum
FRAME offset 4+N+sizeof checksum: sentinel (e.g. 0x00, or a larger unique signature)

该协议的结构使协议更具可扩展性。无需接触所有其他代码即可轻松添加加密/压缩。内置错误检测等功能。

您所指的cycleMessage是什么?cycleMessage是从服务器发送到客户端的消息。例如,它可以是时间戳,并将每msx发送一次感谢您的帮助回答。有一个我不清楚的问题:我的客户机不可能按请求进行异步写入,而客户机异步读取得到它吗?它是否总是保存只有服务器读取和写入客户机?如果我的客户机和服务器同时写入会发生什么情况?不,不会发生。流套接字是全双工通道。您认为呢一端出现(仅)另一端客户端和服务器具有不同的套接字(假设您实际上没有在同一进程中写入这两个套接字…)。在同一进程中,您需要在单个套接字上同步操作。我假设在io_service.run()的一个实例中我不需要同步,或者?我在客户端尝试了一个异步读取,它一直读取我的套接字,我有一个sendMessage方法,在收到用户输入时将数据写入套接字。我认为boost asio进行同步?你说的“inside run()”是什么意思?这是库内部。如果你是说,“只有一个线程运行
io_service::run()
,那么,是的,您拥有所谓的线程。另请参见
FRAME offset 0: message length(N)
FRAME offset 4: message data
FRAME offset 4+N: message checksum
FRAME offset 4+N+sizeof checksum: sentinel (e.g. 0x00, or a larger unique signature)