#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;
}
libhv_tcpclient_server_test
最新推荐文章于 2023-05-08 17:00:20 发布