本例中我们采用多个线程向服务器发送数据,但只是用一个连接。客户端与服务器建立连接后调用open方法,在此方法中启动TRD_NUM个数的线程,每一个线程函数获取自己线程的ID,并组成字符串小写的一部分发送给服务器。服务器程序采用可以处理接收请求,并进行显示的服务器即可,如ACEAcceptorInputHandler.exe
例子程序使用activate方法,激活指定书目的线程函数。
#include "stdafx.h" #include "ace/Connector.h" #include "ace/Reactor.h" #include "ace/Svc_Handler.h" #include "ace/SOCK_Acceptor.h" #include "ace/Synch.h" #include "ace/Acceptor.h" #include "ace/SOCK_Connector.h" #define BUF_LEN 11 #define TRD_NUM 8 /* *用于连接发送 *当与服务器程序连接请求建立时,open方法将会被回调执行 *程序创建TRD_NUM个线程,每一个线程将自己的ID发送给服务器 */ class SvcHandler : public ACE_Svc_Handler<ACE_SOCK_STREAM,ACE_NULL_SYNCH> { public: int open(void*) { ACE_DEBUG((LM_DEBUG,ACE_TEXT("connection established/n"))); //启动TRD_NUM个线程,向服务器发送数据 activate(THR_NEW_LWP,TRD_NUM,0,ACE_DEFAULT_THREAD_PRIORITY, -1, this, 0, 0, 0, m_tIDs); return 0; } //线程函数入口 int svc(void) { char szMsg[BUF_LEN]; ACE_OS::sprintf(szMsg,"MSG:d",ACE_Thread::self()); while(1) { peer().send_n(szMsg,BUF_LEN - 1); ACE_OS::sleep(1); } return 0; } private: char m_szMsg[BUF_LEN]; ACE_thread_t m_tIDs[TRD_NUM]; }; //连接器类型创建 typedef ACE_Connector<SvcHandler,ACE_SOCK_CONNECTOR> Connector; int ACE_TMAIN(int argc, ACE_TCHAR* argv[]) { //指定连接的服务器和端口号 ACE_INET_Addr iaRemote(27002,"localhost"); SvcHandler* pSvcHandler = new SvcHandler; Connector c; //连接服务器 if(c.connect(pSvcHandler,iaRemote) == -1) { ACE_DEBUG((LM_DEBUG,ACE_TEXT("connect error!/n"))); return -1; } while (1) { ACE_Reactor::instance()->handle_events(); } return 0; }