boost::asio::async_write问题,回调函数没有被调用!

youngwolf 2012-02-29 02:33:19
连接:

main(...)
{
boost::asio::io_service io_service;
tcp::socket socket(io_service);
socket.async_connect(boost::asio::ip::tcp::endpoint(boost::asio::ip::address(), 5050),
connect_handler);
io_service.poll(); //connect_handler被调用了,连接成功

boost::system::error_code error;
size_t len = strlen(buff) + 1;
boost::asio::mutable_buffers_1 send_buff = boost::asio::buffer(buff, len);

boost::asio::async_write(socket, send_buff, boost::asio::transfer_at_least(len), send_handler);
cout << "io_service.run() " << io_service.poll() << endl;
//send_handler没有被调用,io_service.poll()返回0


问题请看注释。
注:服务端接收数据是完全正常的(所以客户端发送肯定也是成功的),服务端用api的epoll模型,没有使用asio,不过这肯定不是问题。
服务端与客户端同机。使用127.0.0.1这个ip连接。
...全文
768 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mukalhl 2013-07-27
  • 打赏
  • 举报
回复 1
我也碰到这个问题了,,async_write不回调,, 但是在windows平台下却正常回调, 在linux下面就没回调了,好奇怪。都是一样的代码。
退学者的游戏 2012-03-02
  • 打赏
  • 举报
回复
你没有真正run()啊!!!
弱水垂钓 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yang79tao 的回复:]
cout << "io_service.run() " << io_service.poll() << endl;
这个里面的poll改成run效果一样。
或者把上面一行直接写成io_service.run();也不行。
[/Quote]

// TestBoost.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <boost/asio.hpp>
#include <iostream>
using namespace std;
using boost::asio::ip::tcp;
void connect_handler(const boost::system::error_code& error /*Result of operation*/);
void send_handler(const boost::system::error_code& error /*Result of operation*/, size_t bytes_transferred);

int _tmain(int argc, _TCHAR* argv[])
{
/*
boost::asio::io_service io;
boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
t.wait();
std::cout<< "hello world"<<endl;
*/
char chBuffer[1024]="abcdefsdlkfjsdlfjsldjflsdjflsdjfkljk";
boost::asio::io_service io_service;
tcp::socket socket(io_service);
cout<<boost::asio::ip::address()<<endl;
socket.async_connect(boost::asio::ip::tcp::endpoint(boost::asio::ip::address(), 5050), connect_handler);
io_service.poll(); //connect_handler被调用了,连接成功

boost::system::error_code error;
size_t len = strlen(chBuffer) + 1;
boost::asio::mutable_buffers_1 send_buff = boost::asio::buffer(chBuffer, len);

boost::asio::async_write(socket, send_buff, boost::asio::transfer_at_least(len), send_handler);
cout << "io_service.run() " << io_service.poll() << endl;
getchar();
return 0;
}

void connect_handler(const boost::system::error_code& error /*Result of operation*/)
{
if ( !error )
{
cout<<"abc"<<endl;
}
else
{
cout<<"connect"<<endl;
}
}

void send_handler(const boost::system::error_code& error, // Result of operation.
size_t bytes_transferred // Number of bytes written from the
// buffers. If an error occurred,
// this will be less than the sum
// of the buffer sizes.
)
{
if ( !error )
{
cout<<"abc"<<endl;
}
else
{
cout<<"send"<<endl;
}
}

这是我测试的代码,在vs2010下可以正常运行输出
abc
send
io_service.run() 2
不明白为什么你的运行不正常,send_handler定义和实现不对?
可能性不大,编译都通过了
.....
youngwolf 2012-03-02
  • 打赏
  • 举报
回复
cout << "io_service.run() " << io_service.poll() << endl;

这个里面的poll改成run效果一样。
或者把上面一行直接写成io_service.run();也不行。
弱水垂钓 2012-03-01
  • 打赏
  • 举报
回复
正在学asio,和你一样的代码,不过我的两个handler都只是cout
看到io_service.run() 2
闲的每日C 2012-03-01
  • 打赏
  • 举报
回复
http://code.google.com/p/boost-doc-zh/downloads/list
这里有个boost的中文文档。看过了吗?我也学了一下boost,不过asio没细看。
youngwolf 2012-02-29
  • 打赏
  • 举报
回复
连接和数据发送都在main函数里面。

connect_handler和send_handler是全局函数,签名肯定正确(否则过不了编译)。

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧