Chinaunix首页 | 论坛 | 博客
  • 博客访问: 288892
  • 博文数量: 41
  • 博客积分: 2015
  • 博客等级: 大尉
  • 技术积分: 493
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-19 11:06
文章分类

全部博文(41)

文章存档

2011年(1)

2009年(40)

我的朋友

分类: C/C++

2009-02-28 09:33:57

汗,敲个回车居然发表了,只有再接着发了,sorry
客户端代码如下:

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
using boost::asio::ip::tcp;


class client
{
public:
    client(boost::asio::io_service& io_service,tcp::endpoint& endpoint)
        : socket(io_service)//这里就把socket实例化了
    {
        //连接服务端 connect
        socket.async_connect(endpoint,
            boost::bind(&client::handle_connect,this,boost::asio::placeholders::error)
            );
        memset(getBuffer,'\0',1024);
    }
    ~client()
    {}
private:
    void handle_connect(const boost::system::error_code& error)
    {
        if(!error)
        {
            //一连上,就向服务端发送信息
            boost::asio::async_write(socket,boost::asio::buffer("hello,server!"),
                boost::bind(&client::handle_write,this,boost::asio::placeholders::error));
            
            /**读取服务端发下来的信息
            *这里很奇怪,用async_read根本就不能进入handle_read函数
            **/

// --已经解决,boost::asio::async_read(...)读取的字节长度不能大于数据流的长度,否则就会进入

// ioservice.run()线程等待,read后面的就不执行了。


            //boost::asio::async_read(socket,
            //    boost::asio::buffer(getBuffer,1024),
            //    boost::bind(&client::handle_read,this,boost::asio::placeholders::error)
            //    );
            socket.async_read_some(boost::asio::buffer(getBuffer,1024),
                boost::bind(&client::handle_read,this,boost::asio::placeholders::error)
                );
            
        }
        else
        {
            socket.close();
        }
    }
    void handle_read(const boost::system::error_code& error)
    {
        if(!error)
        {
            std::cout << getBuffer << std::endl;
            //boost::asio::async_read(socket,
            //        boost::asio::buffer(getBuffer,1024),
            //        boost::bind(&client::handle_read,this,boost::asio::placeholders::error)
            //        );
            
            //这样就可以实现循环读取了,相当于while(1)
            //当然,到了这里,做过网络的朋友就应该相当熟悉了,一些逻辑就可以自行扩展了
            //想做聊天室的朋友可以用多线程来实现
            socket.async_read_some(
                    boost::asio::buffer(getBuffer,1024),
                    boost::bind(&client::handle_read,this,boost::asio::placeholders::error)
                    );
        }
        else
        {
            socket.close();
        }
    }
    void handle_write(const boost::system::error_code& error)
    {
    }

private:
    tcp::socket socket;
    char getBuffer[1024];
};

int main(int argc,char* argv[])
{
    //if(argc != 3)
    //{
    //   std::cerr << "Usage: chat_client \n";
    //    return 1;
    //}

    //我觉IO_SERVICE是一个基本性的接口,基本上通常用到的类实例都需要通过它来构造
    //功能我们可以看似socket
    boost::asio::io_service io_service;
    //这个终端就是服务器
    //它的定义就可以看作时sockaddr_in,我们用它来定义IP和PORT
    tcp::endpoint endpoint(boost::asio::ip::address_v4::from_string("192.168.1.119"/*argv[1]*/),8100/*argv[2]*/);
    //既然socket和sockaddr_in已经定义好了,那么,就可以CONNECT了
    //之所以为了要把连接和数据处理封成一个类,就是为了方便管理数据,这点在服务端就会有明显的感觉了
    boost::shared_ptr<client> client_ptr(new client(io_service,endpoint));
    //执行收发数据的函数
    io_service.run();
    return 0;
}

阅读(7848) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

疯狂善良2009-08-17 12:50:06

error是0就对了,如果非0的话,表示通信出现错误或者中断

疯狂善良2009-06-19 14:36:07

this: 就是指当前这个类的内存块了 boost::asio::placeholders: 其实这个是占位符,就是在函数外面调用参数的时候,用来在()里当参数占位的。当然,这里不是这样了。error之所以一直为0,那是因为通讯良好,没有出现错误。比如,在async_read()时,如果网络掉线或者对方断开连接,那么error就会为1,表示连接出问题了。

chinaunix网友2009-06-17 14:10:38

问下boost::bind(&client::handle_write,this,boost::asio::placeholders::error)这句中的后面两个参数是什么意思,特别是boost::asio::placeholders::error,他这个error好像一直都是0阿,就是跳不出来,麻烦指点