libhv_tcpclient_server_test

#include "hv/TcpClient.h"
#include "hv/TcpServer.h"
#include "hv/htime.h"
#include <memory>
#include <utility>
#include <thread>
#include <chrono>
#include <functional>
#include <atomic>

#define TEST_RECONNECT  1

using namespace hv;

SocketChannelPtr srv_ch;
SocketChannelPtr cli_ch;
std::shared_ptr<TcpServer> srv;

int main(int argc, char* argv[])
{
    int remote_port = 9563;
    TcpClient cli;
    int connfd = cli.createsocket(remote_port, "192.168.2.124");

    if (connfd < 0)
    {
    }

    printf("client will connect to port %d, connfd=%d ...\n", remote_port, connfd);
    cli.onConnection = [&cli](const SocketChannelPtr & channel)
    {
        cli_ch = channel;
        std::string peeraddr = cli_ch->peeraddr();

        if (cli_ch->isConnected())
        {
            printf("client connected to %s! connfd=%d\n", peeraddr.c_str(), cli_ch->fd());
            printf("start server\n");
            srv = std::make_shared<TcpServer>();
            srv->onConnection = [](const SocketChannelPtr & channel)
            {
                std::string peeraddr = channel->peeraddr();
                srv_ch = channel;

                if (channel->isConnected())
                {
                    printf("[server] %s connected! connfd=%d id=%d tid=%ld\n", peeraddr.c_str(), channel->fd(), channel->id(), currentThreadEventLoop->tid());
                }
                else
                {
                    printf("[server] %s disconnected! connfd=%d id=%d tid=%ld\n", peeraddr.c_str(), channel->fd(), channel->id(), currentThreadEventLoop->tid());
                }
            };
            srv->onMessage = [](const SocketChannelPtr & channel, Buffer * buf)
            {
                //printf("tcp server<ch:%d> recv[%d]:%s\n", channel->id(), (int)buf->size(), (char*)buf->data());

                if(cli_ch)
                {
                    cli_ch->write((char*)buf->data(), (int)buf->size());
                }
            };
            srv->onWriteComplete = [](const SocketChannelPtr & channel, Buffer * buf)
            {
                //printf("send ok[%d]:%s\n", (int)buf->size(), (char*)buf->data());
            };
            int port = 9124;
            int listenfd = srv->createsocket(port, "192.168.2.131");

            if (listenfd < 0)
            {
                return -20;
            }

            printf("server listen on port %d, listenfd=%d ...\n", port, listenfd);
            srv->max_connections = 1;
            srv->setThreadNum(4);
            srv->start(true);
            // send(time) every 3s
            setInterval(3000, [channel](TimerID timerID)
            {
                if (channel->isConnected())
                {
                    if (channel->isWriteComplete())
                    {
                        char str[DATETIME_FMT_BUFLEN] = {0};
                        datetime_t dt = datetime_now();
                        datetime_fmt(&dt, str);
                        //channel->write(str);
                    }
                }
                else
                {
                    killTimer(timerID);
                }
            });
        }
        else
        {
            printf("*** client disconnected to %s! connfd=%d\n", peeraddr.c_str(), channel->fd());

            if(srv)
            {
                printf("close server\n");
                srv->stop(true);
                srv.reset();
            }
        }

        if (cli.isReconnect())
        {
            printf("client reconnect cnt=%d, delay=%d\n", cli.reconn_setting->cur_retry_cnt, cli.reconn_setting->cur_delay);
        }
    };
    cli.onMessage = [](const SocketChannelPtr & channel, Buffer * buf)
    {
        if(srv_ch)
        {
            srv_ch->write((char*)buf->data(), (int)buf->size());
        }

        //printf("tcp client recv[%d]:%s\n", (int)buf->size(), (char*)buf->data());
    };
#if TEST_RECONNECT
    // reconnect: 1,2,4,8,10,10,10...
    reconn_setting_t reconn;
    reconn_setting_init(&reconn);
    reconn.min_delay = 1000;
    reconn.max_delay = 10000;
    reconn.delay_policy = 0;
    cli.setReconnect(&reconn);
#endif
    cli.start();

    while(1)
    {
        sleep(1);
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值