读书人

用boost库写的客户端代码有点有关问题

发布时间: 2012-12-28 10:29:04 作者: rapoo

用boost库写的客户端代码有点问题,求指正!!

C/C++ code
求解求解,问题如下:在没开服务器的情况下,用 CBSocketMgr 调用 connectTest / connect 就异常,也提示连接成功。不知道为什么,求指正!!代码如下:int main(){         asio::io_service ios;        // 用 CBSocketMgr 调用 connectTest / connect 就异常,没在服务器也提示连接成功。//      CBSocketMgr socketMgr(ios,port);//      socketMgr.Connect(ipAddress.c_str());//      ios.run();     // 直接调用 connectTest 正常//      CBSocket Socket(ios);//       Socket.connectTest(ipAddress.c_str(),port);    //  异部直接调用 connect 正常       CBSocket Socket(ios);       Socket.connect(ipAddress.c_str(),port);     ios.run();}////CBSocket///////////////////////////////////////////////////////////////////////////////////////class CBSocket{public:    CBSocket(asio::io_service& ios);    ~CBSocket(void);    void Close();    bool isClosed();    tcp::socket& GetSocket(){return m_socket;}    bool SendPack(char* pack);    bool SendPack(std::string pack);    void recv();    bool revcHandle(const boost::system::error_code& error,size_t bytes_transferred);    void send();    bool sendHandle(const boost::system::error_code& error);    bool connect(const char* ip,uint16 port);    void connectHandle(const boost::system::error_code& error);        void connectTest(const char* ip,uint16 port);private:    tcp::socket m_socket;    boost::mutex        m_RecvMutex;    char    m_RecvBuff[RECV_BUFF_SIZE];    int        m_nRecvLen;    char    m_SendBuff[SEND_BUFF_SIZE];    int        m_nSendLen;    CWorldSession* m_worldSession;};#include "BSocket.h"CBSocket::CBSocket(asio::io_service& ios): m_socket(ios){    memset(m_RecvBuff,0,sizeof(m_RecvBuff));    memset(m_SendBuff,0,sizeof(m_SendBuff));    m_nRecvLen = 0;    m_nSendLen = 0;    m_worldSession = NULL;}CBSocket::~CBSocket(void){    Close();}void CBSocket::Close(){    m_socket.close();}bool CBSocket::isClosed(){    if (m_socket.is_open())        return false;    return true;}bool CBSocket::SendPack(char* pack){    if (!pack)        return false;    int sendLen = strlen(pack);    if (sendLen+m_nSendLen >= 1024)        return false;    memcpy(m_SendBuff+m_nSendLen,pack,strlen(pack));    m_nSendLen += sendLen;    send();    return true;}bool CBSocket::SendPack(std::string pack){    return false;}void CBSocket::recv(){    m_RecvMutex.lock();    m_socket.async_read_some(asio::buffer((void*)m_RecvBuff,1024-m_nRecvLen),        boost::bind(&CBSocket::revcHandle,this,        asio::placeholders::error,asio::placeholders::bytes_transferred));    m_RecvMutex.unlock();}bool CBSocket::revcHandle(const boost::system::error_code& error,size_t bytes_transferred){    if (error)    {        printf("[错误]网络关闭,原因:%s\n",error.message().c_str());        return false;    }    else    {        printf("收到消息:%s\n",m_RecvBuff);        memmove(m_RecvBuff,m_RecvBuff+bytes_transferred,bytes_transferred);        m_nRecvLen = 0;    }    recv();    return true;}void CBSocket::send(){    m_socket.async_write_some(asio::buffer(m_SendBuff,m_nSendLen+1),        bind(&CBSocket::sendHandle,this,asio::placeholders::error));}bool CBSocket::sendHandle(const boost::system::error_code& error){    memmove(m_SendBuff,m_SendBuff+m_nSendLen,m_nSendLen);    m_nSendLen = 0;    if (error)    {        Close();        printf("[错误]发送消息出错,网络关闭!原因:%s\n",error.message().c_str());        return false;    }    return true;}void CBSocket::acceptHandle(){     m_worldSession = new CWorldSession(this);     if (m_worldSession != NULL)         WorldMgr.AddSession(m_worldSession);     recv();}void CBSocket::connectTest(const char* ip,uint16 port){     tcp::endpoint ep(address_v4::from_string(ip), port);     boost::system::error_code ec;     m_socket.connect(ep,ec);     if(ec)     {         printf("[错误]连接失败!原因:%s\n",ec.message().c_str());        return;     }     recv();}bool CBSocket::connect(const char* ip,uint16 port){    if(!ip)    {        printf("[错误]IP地址错误!\n");        return false;    }    tcp::endpoint ep(address_v4::from_string(ip), port);     m_socket.async_connect(ep,bind(&CBSocket::connectHandle,this,asio::placeholders::error));    return true;}void CBSocket::connectHandle(const boost::system::error_code& error){    if(error)    {        printf("[错误]连接失败!原因:%s\n",error.message().c_str());        return;    }    else    {        printf("连接成功!\n");        recv();    }}///////CBSocketMgr///////////////////////////////////////////////////////////////class CBSocketMgr{public:    CBSocketMgr(asio::io_service& ios,uint16 port);    ~CBSocketMgr(void);    void Connect(const char* ip);private:    void NetWorkThread();    asio::io_service&    m_ios;    tcp::acceptor        m_acceptor;    uint16            m_uPort;    CBSocket*        m_pBSocket;};#include "BSocketMgr.h"CBSocketMgr::CBSocketMgr(asio::io_service& ios,uint16 port): m_ios(ios), m_acceptor(m_ios,tcp::endpoint(tcp::v4(),port)), m_uPort(port), m_pBSocket(NULL){}CBSocketMgr::~CBSocketMgr(void){    if (m_pBSocket)        delete m_pBSocket;    m_pBSocket = NULL;}void CBSocketMgr::Connect(const char* ip){    m_pBSocket = new CBSocket(m_ios);    m_pBSocket->connect(ip,m_uPort);         shared_ptr<thread> workThread(new thread(bind(&CBSocketMgr::NetWorkThread,this)));         workThread->join();}void CBSocketMgr::NetWorkThread(){    m_ios.run();    // 停止    // m_ios.stop();} 

读书人网 >C++

热点推荐