- 论坛徽章:
- 1
|
本帖最后由 hiterator 于 2013-03-20 10:28 编辑
刚学习ACE编程,找了个程序调试了下,看起来没问题;
连接服务器成,之后程序结束时就崩溃了,请懂行的大侠给指导下,看是不是违反了ACE编程规则;
感谢~
补充:
1. 把fini去掉好像就好了,why? 有人说init和fini必须配对使用;
- #include "ace/ACE.h"
- #include "ace/Log_Msg.h"
- #include "ace/OS.h"
- #include "ace/Reactor.h"
- #include "ace/SOCK_Connector.h"
- #define MAX_MYCLIENT_BUFFER (1023)
- #ifdef _DEBUG
- #pragma comment(lib, "ACEd.lib")
- #else
- #pragma comment(lib, "ACE.lib")
- #endif // _DEBUG
- using namespace std;
- class CMyClient : public ACE_Event_Handler
- {
- public:
- bool open()
- {
- ACE_SOCK_Connector conn;
- ACE_INET_Addr addr(6789, "127.0.0.1");
- ACE_Time_Value timeout(5, 0);
- int nRet = conn.connect(peer_, addr, &timeout);
- if (0 != nRet)
- {
- ACE_ERROR((LM_ERROR, "connect ret(%d) failed.\n", nRet));
- return false;
- }
- ACE_Reactor::instance()->register_handler(this, ACE_Event_Handler::READ_MASK);
- ACE_DEBUG((LM_DEBUG, "connect ok.\n"));
- return true;
- }
- int close()
- {
- int nRet = 0;
- nRet = ACE_Reactor::instance()->remove_handler(this, ACE_Event_Handler::READ_MASK);
- return nRet;
- }
- ACE_HANDLE get_handle(void) const
- {
- return peer_.get_handle();
- }
- virtual int handle_input(ACE_HANDLE fd)
- {
- int recv = 0;
- ACE_Time_Value timeout(3, 0);
- recv = peer_.recv(buffer_, MAX_MYCLIENT_BUFFER, &timeout);
- if (recv > 0)
- {
- buffer_[recv] = '\0';
- ACE_DEBUG((LM_DEBUG, "recv: [%s]\n", buffer_));
- }
- else // (recv <= 0)
- {
- ACE_ERROR((LM_ERROR, "[handle_input:%t] recv(%d), error(%d)\n", recv, ::WSAGetLastError()));
- return -1;
- }
- return 0;
- }
- virtual int handle_close(ACE_HANDLE handle, ACE_Reactor_Mask close_mask)
- {
- int nRet = 0;
- nRet = peer_.close();
- return nRet;
- }
- private:
- ACE_SOCK_Stream peer_;
- char buffer_[MAX_MYCLIENT_BUFFER + 1];
- long timer_;
- };
- int main(int, char *[])
- {
- ACE_ERROR((LM_ERROR, "[main tid:%t] start.\n"));
- ACE::init();
- CMyClient *pClient = new CMyClient();
- pClient->open();
- ACE_Reactor::instance()->run_reactor_event_loop(ACE_Time_Value(10)); // 是不是这个使用有问题??
- pClient->close();
- delete pClient; pClient=NULL;
- ACE::fini(); // 把这个去掉好像就好了
- return 0;
- } // 运行结束后程序出现崩溃
复制代码 |
|