用boost库写的客户端代码有点问题,求指正!!
求解求解,问题如下:在没开服务器的情况下,用 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();}