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. IDEA导入他人的项目时提示“project sdk is not defined”的解决办法

    IDEA导入他人的项目时提示"project sdk is not defined"的解决办法 1.在IDEA中,在有问题的项目上单击鼠标右键,然后选择"Open Mod ...

  2. Visual Studio Code启动时总是提示“Code安装似乎损坏。请重新安装。”、标题栏显示“不受支持”等信息的解决办法

    我的VSCode一直提示"Code安装似乎损坏.请重新安装."同时标题栏显示"不受支持"就像这样: 反思了一下,应该是我安装的background插件,把vsc ...

  3. VS2010/MFC 获取当前程序路径的方法

    第一种方法 DWORD GetCurrentDirectory( DWORD nBufferLength, // size, in characters, of directory buffer LP ...

  4. 推荐 5 个 火火火火 的CMS开源.Net项目

    下面推荐5个基于.NetCore开发的CMS开源项目. 一.OrchardCore 基于ASP.NET Core 构建的.模块化和多租户应用程序框架,采用文档数据库,非常高性能,跨平台的系统. 1.跨 ...

  5. spark (一) 入门 & 安装

    目录 基本概念 spark 核心模块 spark core (核心) spark sql (结构化数据操作) spark streaming (流式数据操作) 部署模式 local(本地模式) sta ...

  6. macOS安装编译pcl

    macOS安装编译pcl git clone git@github.com:PointCloudLibrary/pcl.git cd pcl brew install eigen brew insta ...

  7. 让我看看有多少人不知道Vue3中也能实现高阶组件HOC

    前言 高阶组件HOC在React社区是非常常见的概念,但是在Vue社区中却是很少人使用.主要原因有两个:1.Vue中一般都是使用SFC,实现HOC比较困难.2.HOC能够实现的东西,在Vue2时代mi ...

  8. SQL统计数据之总结

    一.查询SQL SELECT t1.规则编号 AS 编码, t1.规则描述 AS 名称, SUM( CASE WHEN t3.DATA_SOURCES = '00' THEN 1 ELSE 0 END ...

  9. 经典算法的Java实现

    1.快速排序描述 1.每一轮排序选择一个基准点(pivot)进行分区 1.让小于基准点的元素进入一个分区,大于基准点的元素进入另一个分区 2.当分区完成时,基准点元素的位置就是其最终位置 2.在子分区 ...

  10. Dicom C-move 请求QR服务

    个人理解 Dicom C-get 就是在没有设置任何验证情况下请求QR服务,而C-move是有验证的情况下请求QR服务.一般都是C-move,因为机器都需要验证. Dicom C-move 原理:自己 ...