libhv学习路线 之 TCP客户端

        TCP客户端的代码实现由于基本思路和服务器差不多,所以我就不进行代码讲解了,只是展示以下我的具体实现过程:

        A.调用hloop_new()函数建立事件脚本;

hloop_t *loop = hloop_new(0);

        B.调用hloop_create_tcp_client()函数与服务器建立连接,并且返回连接socket,在连接socket对应上的I/O事件上创建connect事件,绑定on_connect()用户回调函数;

hio_t *connectio = hloop_create_tcp_client(loop, "127.0.0.1", port, on_connect);

        C.运行循环事件,从而阻塞等待连接事件发生,然后在on_connect()回调函数中,再给该连接socket上对应的I/O事件创建read事件,并且绑定on_recv()回调函数,再建立timer定时器,定时时间为1秒,绑定on_timer()回调函数,当触发定时事件后,再在on_timer()回调函数中给连接socket上对应的I/O事件上创建write事件,绑定on_send()回调函数;

hloop_run(loop);

        D.结束循环.

        具体代码如下所示:

#include "hv/hloop.h"
#include "hv/htime.h"

void on_close(hio_t *io){
	printf("TCP connection closed");
}

void on_send(hio_t* io, const void* buf, int writebytes){
	printf("we sended a data to server: %s\n", (char *)buf);
}

void on_timer(htimer_t *timer)
{
	char str[DATETIME_FMT_BUFLEN] = {0};
	datetime_t dt = datetime_now();
	datetime_fmt(&dt, str);
	
	hio_t *io = (hio_t *)hevent_userdata(timer);
	hio_setcb_write(io, on_send);
	hio_write(io, "we need a data from server!", 27);
}

void on_recv(hio_t* io, void* buf, int readbytes) {
        printf("we received a data from server: %s\n", (char *)buf);//回显数据
}

void on_connect(hio_t *io)
{
	printf("connect successfully!\n");	
	hio_setcb_close(io, on_close);
	hio_setcb_read(io, on_recv);
	hio_read(io);//注册读事件
	
	htimer_t *timer = htimer_add(hevent_loop(io), on_timer, 1000, INFINITE);//创建定时器事件
	hevent_set_userdata(timer, io);
}

int main(int argc, char** argv)
{
	if(argc < 2)
	{
		printf("there is no port number\n");
		return -1;
	}
	int port = atoi(argv[1]);
	//创建事件循环
	hloop_t *loop = hloop_new(0);
	//创建TCP服务
	hio_t *connectio = hloop_create_tcp_client(loop, "127.0.0.1", port, on_connect);
	if(connectio == NULL)
	{
		printf("connect socket is created failed\n");
	}
	// 运行事件循环
   	hloop_run(loop);
    	// 释放事件循环
    	hloop_free(&loop);
    	return 0;
}

        该客户端与上一节的服务器进行通讯,运行结果如下所示:

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值