高性能分布式网络服务器--TCPServer模块

TCPServer模块

TCPServer模块是采用Template Pattern设计模式封装了一个常规TCP服务器。支持同时绑定多个地址进行监听,只需要在绑定时传入地址数组即可。还可以分别指定接收客户端和处理客户端的协程调度器

github

https://github.com/huxiaohei/tiger.git

实现

初始化TCPServer时需要制定两个IO调度器,分别用于接受客户端和处理客户端请求。在接受到客户端连接请求时,生成对应的客户端Socket实例(前面在接受Socket模块的时候已经介绍过,Socket所对应的sock会在IO调度器中注册读写事件),并将Socket实例交由handle_client处理

因此,使用TCPServer时,必须从TCPServer派生一个新类,并重新实现子类的handle_client

使用可以参考EchoServer

class EchoServer : public tiger::TCPServer {
   public:
    void handle_client(tiger::Socket::ptr client) override {
        TIGER_LOG_D(tiger::TEST_LOG) << "[handle client:" << client << "]";
        auto buf = std::make_shared<tiger::ByteArray>();
        while (true) {
            buf->clear();
            std::vector<iovec> iovs;
            buf->get_enable_write_buffers(iovs, 1024);
            int rt = client->recv(&iovs[0], iovs.size());
            if (rt == 0) {
                TIGER_LOG_I(tiger::TEST_LOG) << "[has closed client:" << client << "]";
                break;
            } else if (rt < 0) {
                TIGER_LOG_E(tiger::TEST_LOG) << "[client error"
                                             << " erron:" << strerror(errno) << "]";
                break;
            }
            buf->set_position(buf->get_position() + rt);
            buf->set_position(0);
            const std::string &msg = buf->to_string();
            TIGER_LOG_D(tiger::TEST_LOG) << "[Echo receive: " << msg << "]";
            client->send(msg.c_str(), msg.size());
            if (msg.find("stop") == 0) {
                TIGER_LOG_I(tiger::TEST_LOG) << "[ECHO STOP]";
                stop();
                tiger::IOManager::GetThreadIOM()->stop();
            }
        }
    }
};


void run() {
    auto addr = tiger::Address::LookupAny("0.0.0.0:8080");
    auto ech_server = std::make_shared<EchoServer>();
    ech_server->bind(addr);
    ech_server->start();
}

int main() {
    tiger::SingletonLoggerMgr::Instance()->add_loggers("tiger", "../conf/tiger.yml");
    tiger::Thread::SetName("TCPServer");
    TIGER_LOG_D(tiger::TEST_LOG) << "[tcp_server test start]";
    auto iom = std::make_shared<tiger::IOManager>("TCPServer", true, 1);
    iom->schedule(run);
    iom->start();
    TIGER_LOG_D(tiger::TEST_LOG) << "[tcp_server test end]";
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虎小黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值