提升 TCP async_receive_some不会第二次读取
Boost TCP async_receive_some doesn't read second time
我尝试拥有一个tcp-server,它正在读取数据,处理它们并将其发送回。之后,它将等待新数据。我的问题是,该服务器首次发送数据正常运行。在第二次,该程序停留在run_one()
-loop。
size_t m_lengthReceive;
io_service m_ioService;
std::vector<unsigned char> m_vectorBuffer;
unsigned char m_bufferReceive[128];
void SyncServer::initialize(){
m_acceptor = shared_ptr<tcp::acceptor>(
new tcp::acceptor(m_ioService,
tcp::endpoint(tcp::v4(), m_port)));
m_acceptor->set_option(tcp::acceptor::reuse_address(true));
m_sock = shared_ptr<tcp::socket>(new tcp::socket(m_ioService));
m_acceptor->accept(*m_sock, m_ec);
}
void SyncServer::tcpReceiveVector(){
boost::system::error_code ec;
m_sock->async_read_some(buffer(m_bufferReceive),
boost::bind(&SyncServer::tcpReceiveHandler, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
do{
m_ioService.run_one();
}while(m_lengthReceive == 0);
}
void SyncServer::tcpReceiveHandler(const boost::system::error_code& ec,
size_t size){
if(size > 0 && !ec){
m_sock->cancel();
m_lengthReceive = size;
m_vectorBuffer.resize(m_lengthReceive);
int i = 0;
for(std::vector<unsigned char>::iterator it = m_vectorBuffer.begin();
it != m_vectorBuffer.end(); ++it){
*it = m_bufferReceive[i];
++i;
}
}else{
m_lengthReceive = 0;
m_sock->async_read_some(buffer(m_bufferReceive),
boost::bind(&SyncServer::tcpReceiveHandler, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
}
std::vector<unsigned char> SyncServer::getVectorBuffer(){
return m_vectorBuffer;
}
void SyncServer::openConnection(){
if(!m_sock->is_open())
m_sock->open(tcp::v4());
m_lengthReceive = 0;
}
void SyncServer::closeConnection(){
m_sock->close();
}
main(){
m_tcpServer = shared_ptr<SyncServer>(new SyncServer(m_tcpPort));
m_tcpServer->initialize();
while(1){
m_tcpServer->openConnection();
m_tcpServer->tcpReceiveVector();
vector = m_tcpServer->getVectorBuffer();
//do something with vector
m_tcpServer->tcpSend(vector); //this works fine
m_tcpServer->closeConnection();
}
}
更新的代码:
void SyncServer::tcpReceiveHandler(const boost::system::error_code& ec,
size_t size){
if(ec){
std::cout<< ec << std::endl;
}else{
if(size > 0){
m_sock->cancel();
m_lengthReceive = size;
m_vectorBuffer.resize(m_lengthReceive);
int i = 0;
for(std::vector<unsigned char>::iterator it = m_vectorBuffer.begin();
it != m_vectorBuffer.end(); ++it){
*it = m_bufferReceive[i];
++i;
}
}else{
m_lengthReceive = 0;
m_sock->async_read_some(buffer(m_bufferReceive),
boost::bind(&SyncServer::tcpReceiveHandler, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
}
}
在您的接收处理程序中,只有在有问题(?)
void SyncServer::tcpReceiveHandler(const boost::system::error_code& ec,
size_t size){
if(size > 0 && !ec){
m_sock->cancel();
m_lengthReceive = size;
m_vectorBuffer.resize(m_lengthReceive);
int i = 0;
for(std::vector<unsigned char>::iterator it = m_vectorBuffer.begin();
it != m_vectorBuffer.end(); ++it){
*it = m_bufferReceive[i];
++i;
}
}else{
m_lengthReceive = 0;
m_sock->async_read_some(buffer(m_bufferReceive),
boost::bind(&SyncServer::tcpReceiveHandler, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
}
在此回调上,您需要排队下一个读取(通常没有问题,当有问题时不要!)
除了NIM回答的内容外,您还进行了经典的ASIO错误。如下所示:http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/reference/io_service/run_one_one/run_one/overload1.html"除非有事先调用reset(),否则将立即返回run(),run_one(),poll_one()的后续呼叫()。"
.run_one
后,您需要致电m_ioservice.reset()
,否则它将再也不会运行。它只是返回而不是调用任何异步操作,因此m_lengthReceive
在第一次之后不会更改。
do{
m_ioService.run_one();
m_ioService.reset();
}while(m_lengthReceive == 0);
这是人们通常不使用run_one()
而是run()
并在最后一个处理程序中启动新的异步操作的原因。在这种情况下,run()
不返回,不需要reset()
。
相关文章:
- 如何从给定字符串中删除第二次和第三次出现的$
- getopt_long_only第二次调用时返回 -1
- 读取文件在第二次调用时返回INVALID_HANDLE
- 如何使用C++一次读取整个二进制文件
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 解释为什么第二次分配会改变性能
- 当再次触发信号时,从Qt插槽执行的功能被第二次调用时会发生什么?
- 如何防止GUI挂起,同时允许第二次操作与Qt中的第一次操作一起执行
- 如何找到数组中值倒数第二次出现的索引
- 如何从文本文件中一次读取一个字符
- arm_data在第二次运行我的程序时中止失败,然后
- Java 套接字读取在第二次读取时返回奇怪字符
- 提升 Asio SSL 无法第二次接收数据(第一次确定)
- 一次读取一个字节的 unicode
- 来自 txt 文件的输入在第二次读取/传递时不匹配 (C++)
- 提升 TCP async_receive_some不会第二次读取
- qt文件读取行在第二次读取时总是返回-1
- 在c语言中第二次读取文件时程序崩溃
- C++ 提升 ASIO |同步写入到异步读取 |无法在第二次读取中接收正确的数据
- 连续两次读取套接字,第二次读取不起作用