编写一个使用ACE框架的TCP SERVER 的demo
时间: 2024-05-03 09:22:14 浏览: 182
下面是一个使用ACE框架的TCP SERVER的Demo代码:
```c++
#include "ace/INET_Addr.h"
#include "ace/OS.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/SOCK_Stream.h"
class MyTCPHandler : public ACE_Event_Handler {
public:
MyTCPHandler() {}
virtual ~MyTCPHandler() {}
virtual ACE_HANDLE get_handle() const {
return peer_.get_handle();
}
virtual int handle_input(ACE_HANDLE fd) {
char buf[1024];
ssize_t n = peer_.recv(buf, sizeof(buf));
if (n <= 0) {
ACE_DEBUG((LM_DEBUG, "Connection closed.\n"));
return -1;
}
ACE_DEBUG((LM_DEBUG, "Received %d bytes: %s\n", n, buf));
return 0;
}
virtual int handle_close(ACE_HANDLE fd, ACE_Reactor_Mask mask) {
ACE_DEBUG((LM_DEBUG, "Connection closed.\n"));
delete this;
return 0;
}
void set_peer(const ACE_SOCK_Stream& peer) {
peer_ = peer;
}
private:
ACE_SOCK_Stream peer_;
};
int main(int argc, char* argv[]) {
ACE_INET_Addr listen_addr(8888);
ACE_SOCK_Acceptor acceptor;
if (acceptor.open(listen_addr) == -1) {
ACE_ERROR((LM_ERROR, "%p\n", "open"));
return 1;
}
ACE_Reactor reactor;
ACE_Time_Value timeout(0, 100 * 1000);
while (true) {
ACE_SOCK_Stream peer;
ACE_INET_Addr peer_addr;
if (acceptor.accept(peer, &peer_addr) == -1) {
ACE_ERROR((LM_ERROR, "%p\n", "accept"));
continue;
}
ACE_DEBUG((LM_DEBUG, "Connected: %s\n", peer_addr.get_host_name()));
MyTCPHandler* handler = new MyTCPHandler();
handler->set_peer(peer);
reactor.register_handler(handler, ACE_Event_Handler::READ_MASK);
}
return 0;
}
```
这个Demo创建了一个TCP Server,监听8888端口,当有客户端连接时,将创建一个MyTCPHandler对象来处理连接。MyTCPHandler继承自ACE_Event_Handler,重载了handle_input和handle_close方法。当有数据可读时,handle_input方法将被调用,读取数据并输出到控制台。当连接关闭时,handle_close方法将被调用,关闭连接并删除这个MyTCPHandler对象。
在主函数中,使用ACE_SOCK_Acceptor类监听指定地址和端口,当有客户端连接时,创建一个MyTCPHandler对象并注册到ACE_Reactor中。循环等待客户端连接。
当客户端连接时,程序将创建一个ACE_SOCK_Stream对象,该对象将作为MyTCPHandler的peer_成员,保存客户端连接信息。然后创建一个MyTCPHandler对象,并将其注册到ACE_Reactor中,以便处理连接。
阅读全文