libevent版本:libevent-2.0.22-stable

服务端:

#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <signal.h> #include <event2/bufferevent.h>
#include <event2/buffer.h>
#include <event2/listener.h>
#include <event2/util.h>
#include <event2/event.h> static const int PORT = 9995; static char g_szWriteMsg[256] = { 0 };
static char g_szReadMsg[256] = { 0 };
static int g_iCnt = 0; static void listener_cb(struct evconnlistener *, evutil_socket_t, struct sockaddr *, int socklen, void *);
static void conn_writecb(struct bufferevent *, void *);
static void conn_readcb(struct bufferevent *, void *);
static void conn_eventcb(struct bufferevent *, short, void *); int main(int argc, char **argv)
{
struct event_base *base;
struct evconnlistener *listener;
struct event *signal_event; struct sockaddr_in sin; WSADATA wsa_data;
WSAStartup(MAKEWORD(2, 2), &wsa_data); base = event_base_new();
if (!base)
{
fprintf(stderr, "Could not initialize libevent!\n");
return 1;
} memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);//固定一个端口号 //创建、绑定、监听socket
listener = evconnlistener_new_bind(base, listener_cb, (void *)base,
LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, -1,
(struct sockaddr*)&sin,
sizeof(sin)); if (!listener)
{
fprintf(stderr, "Could not create a listener!\n");
return 1;
} event_base_dispatch(base); evconnlistener_free(listener);
//event_free(signal_event);
event_base_free(base); printf("done\n");
return 0;
} //有连接来时调用
static void listener_cb(struct evconnlistener *listener, evutil_socket_t fd,
struct sockaddr *sa, int socklen, void *user_data)
{
struct event_base *base = (struct event_base*)user_data;
struct bufferevent *bev; //构造一个bufferevent
bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
if (!bev)
{
fprintf(stderr, "Error constructing bufferevent!");
event_base_loopbreak(base);
return;
} //绑定读事件回调函数、写事件回调函数、错误事件回调函数
bufferevent_setcb(bev, conn_readcb, conn_writecb, conn_eventcb, NULL); bufferevent_enable(bev, EV_WRITE);
bufferevent_enable(bev, EV_READ); const char *szMsg = "hi client!";
bufferevent_write(bev, szMsg, strlen(szMsg));
} static void conn_writecb(struct bufferevent *bev, void *user_data)
{
//printf("touch conn_writecb\n"); // if ( strlen(g_szWriteMsg) > 0 )
// {
// bufferevent_write(bev, g_szWriteMsg, strlen(g_szWriteMsg));
// memset(g_szWriteMsg, 0x00, sizeof(g_szWriteMsg));
// }
} static void conn_readcb(struct bufferevent *bev, void *user_data)
{
//printf("touch conn_readcb\n");
memset(g_szReadMsg, 0x00, sizeof(g_szReadMsg));
struct evbuffer *input = bufferevent_get_input(bev);
size_t sz = evbuffer_get_length(input);
if (sz > 0)
{
bufferevent_read(bev, g_szReadMsg, sz);
printf("cli:>>%s\n", g_szReadMsg);
memset(g_szWriteMsg, 0x00, sizeof(g_szWriteMsg));
snprintf(g_szWriteMsg, sizeof(g_szWriteMsg) - 1, "hi client, this count is %d", g_iCnt);
g_iCnt++;
//printf("ser:>>");
//gets(g_szWriteMsg);
//scanf("%s", g_szWriteMsg); bufferevent_write(bev, g_szWriteMsg, strlen(g_szWriteMsg));
}
} static void conn_eventcb(struct bufferevent *bev, short events, void *user_data)
{
if (events & BEV_EVENT_EOF)
{
printf("Connection closed.\n");
}
else if (events & BEV_EVENT_ERROR)
{
printf("Got an error on the connection: %s\n", strerror(errno));/*XXX win32*/
}
/* None of the other events can happen here, since we haven't enabled
* timeouts */
bufferevent_free(bev);
}

客户端

#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <signal.h> #include <event2/bufferevent.h>
#include <event2/buffer.h>
#include <event2/listener.h>
#include <event2/util.h>
#include <event2/event.h> static const int PORT = 9995;
static char g_szWriteMsg[256] = { 0 };
static char g_szReadMsg[256] = { 0 };
static int g_iCnt = 0;
static void conn_writecb(struct bufferevent *, void *);
static void conn_readcb(struct bufferevent *, void *);
static void conn_eventcb(struct bufferevent *, short, void *); int main(int argc, char **argv)
{
struct event_base *base; struct sockaddr_in sin; WSADATA wsa_data;
WSAStartup(MAKEWORD(2, 2), &wsa_data); base = event_base_new();
if (!base)
{
fprintf(stderr, "Could not initialize libevent!\n");
return 1;
} memset(&sin, 0, sizeof(sin));
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT); struct bufferevent* bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);
if (bev == NULL)
{
fprintf(stderr, "socket init failed\n");
return 1;
}
bufferevent_setcb(bev, conn_readcb, conn_writecb, conn_eventcb, NULL); //连接服务端
int flag = bufferevent_socket_connect(bev, (struct sockaddr*)&sin, sizeof(sin));
if (-1 == flag)
{
fprintf(stderr, "connect failed\n");
return 1;
}
bufferevent_enable(bev, EV_READ | EV_WRITE); event_base_dispatch(base);
event_base_free(base); printf("done\n");
return 0;
} static void conn_writecb(struct bufferevent *bev, void *user_data)
{
//printf("touch conn_writecb\n"); // if ( strlen(g_szWriteMsg) > 0 )
// {
// bufferevent_write(bev, g_szWriteMsg, strlen(g_szWriteMsg));
// memset(g_szWriteMsg, 0x00, sizeof(g_szWriteMsg));
// }
} static void conn_readcb(struct bufferevent *bev, void *user_data)
{
//printf("touch conn_readcb\n");
memset(g_szReadMsg, 0x00, sizeof(g_szReadMsg));
struct evbuffer *input = bufferevent_get_input(bev);
size_t sz = evbuffer_get_length(input);
if (sz > 0)
{
bufferevent_read(bev, g_szReadMsg, sz);
printf("ser:>>%s\n", g_szReadMsg);
memset(g_szWriteMsg, 0, sizeof(g_szWriteMsg));
snprintf(g_szWriteMsg, sizeof(g_szWriteMsg) - 1, "hi server,this count is %d", g_iCnt);
g_iCnt++;
//printf("cli:>>");
//gets(g_szWriteMsg);
//scanf("%s", g_szWriteMsg);
bufferevent_write(bev, g_szWriteMsg, strlen(g_szWriteMsg));
}
} static void conn_eventcb(struct bufferevent *bev, short events, void *user_data)
{
if (events & BEV_EVENT_EOF)
{
printf("Connection closed.\n");
}
else if (events & BEV_EVENT_ERROR)
{
printf("Got an error on the connection: %s\n",
strerror(errno));/*XXX win32*/
}
else if (events & BEV_EVENT_CONNECTED)
{
//连接成功时走这里,并且要客户端第一次触发读事件后连接才真正建立起来
printf("connect success\n");
const char* msg = "hi server,hao are you";
bufferevent_write(bev, msg, strlen(msg));
return;
}
bufferevent_free(bev);
}

参考链接:

https://www.imooc.com/article/292022

使用Win32控制台实现libevent通信的更多相关文章

  1. 【转】WIN32 控制台程序

    http://blog.csdn.net/houmin0036/article/details/7702236 win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运行的应用 ...

  2. vc2010 win32 控制台应用程序中文乱码

    vc2010 win32 控制台应用程序中文乱码 在 vc2010 上用 win32 控制台程序写些测试代码调用 windows api ,处理错误信息时,发现用 wprintf 输出的错误信息出现了 ...

  3. win32控制台实现按任意键退出的功能

    win7之后的五win32 控制台出现了程序运行完之后就立即结束的问题,程序员根本无法看输出的结果.未来让控制台运行完之后能够等待程序员的操作.可以使用: system("PAUSE&quo ...

  4. C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出

    C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出,这里使用到了Windows API SetConsoleCtrlHandler函数 注意:在VS中调试执行时,在处理程序例程中设置断 ...

  5. Linux终端和win32控制台文本颜色输出

    在使用putty.secureCRT.XShell等终端仿真器连接linux系统时,ls.vim等工具的输出都含有各种颜色,这些颜色的输出大大地增强了文本的可读性. 通常我们可以使用echo命令加-e ...

  6. Visual Studio C++ Win32控制台应用程序,Win32项目,MFC的区别

    背景 Visual Studio C++ 创建新项目蹦出来如下选项: Win32控制台应用程序,Win32项目,MFC有什么区别? 正文: Win32控制台,没有界面,命令行执行生成的文件则直接在后台 ...

  7. win32应用程序和win32控制台应用程序的区别

          win32应用程序是有窗体的(当然也可以没有),有Windows消息循环机制的.而win32控制台应用程序只是在控制台下运行的程序,类似以前dos的程序. 后续答案: Win32 Appl ...

  8. Win32控制台程序和Win32应用程序

    刚接触Windows那一套,大多数概念都还没建立起来,整理了一下网上对“Win32控制台程序”的理解,谢谢各位网友了. win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运 ...

  9. vs2008 新建win32控制台程序提示:脚本错误

    解决方案: 1.根据错误信息中的url,找到对应文件夹下的htm文件 2.使用notepad++打开default.htm文件,找到错误提示的434行,注释掉433和434行 然后保存文件,重新新建w ...

  10. Win32控制台、Win32项目、MFC项目、CLR控制台、CLR空项目、空项目区别

    转载:https://blog.csdn.net/zfmss/article/details/79244696 1.Win32控制台 初始代码模版以main为程序入口,默认情况下,只链接C++运行时库 ...

随机推荐

  1. Linux防火墙端口设置策略

    # 当我们在服务器上部署好我们的环境后,一定要检查一下防火墙的端口策略:否则客户端无法连接.# 查看防火墙状态 systemctl status firewalld # 查看防火墙设已开放的端口 # ...

  2. Note - 两类容斥

    \(\S1.\) 等价容斥   (乱取的名字.)   题目将组合对象构成的 "等价类" 进行了定义和限定. 我们往往无法计数 "等价类真的长这样" 的方案, 而 ...

  3. Solution -「JOISC 2017」「LOJ #2392」烟花棒

    \(\mathscr{Description}\)   Link.   有 \(n\) 个人站在数轴上,第从左往右第 \(i\) 个人的坐标是 \(x_i\),每个人手上有一支烟花棒,每支烟花棒能燃烧 ...

  4. Redis学习笔记之spring-data-redis

    一.关于spring-data-redis spring-data-redis针对jedis提供了如下功能: 连接池自动管理,提供了一个高度封装的"RedisTemplate"类 ...

  5. 《CUDA编程:基础与实践》读书笔记(5):统一内存编程

    统一内存(unified memory)是一种逻辑上的概念,它既不是显存.也不是主机内存,而是CPU和GPU都可以访问并能保证一致性的虚拟存储器.使用统一内存对硬件有较高的要求: 对于所有功能,GPU ...

  6. C# 获取系统声卡音频数据,并绘制波形

    //by wgscd //date:2022/11/7 UI: <Path Stroke="Red" Data="{Binding path}" Rend ...

  7. 新型冠状病毒全国疫情API接口

    一.新浪提供的接口地址:https://interface.sina.cn/news/wap/fymap2020_data.d.json 二.163提供的接口地址:官方展示: https://news ...

  8. drools 规则引擎和 solon-flow 哪个好? 规则引擎 solon-flow 简明教程

    前言 做电子政务的项目时,经常会有大量的业务逻辑变更,但其实里面的业务改动,其实就是一些业务逻辑变动. 而程序员编写的代码也没有任何技术含量,跟着式样书逐字逐句的翻译就行.大量的 if/else 判断 ...

  9. linux mint安装触控板手势fusuma

    安装必要的包,终端输入: sudo apt-get install libinput-tools sudo apt-get install xdotool sudo gem install fusum ...

  10. TIPTOP应付账款流程学习

    应付账款流程与应收账款流程是财务管理的开端,也是财务工作的主要流程. 企业的应付账款有很多种,如原材料的应付账款.电力能源的应付账款.房租的应付账款等,大头是原材料的应付账款,以下详细说明. 在讲解之 ...