Visual Studio 2017开发linux程序之libevent使用实例
下载源码编译安装后,samle里面有个hello-world.c就是最简单的一个tcp server端程序了
/*This example program provides a trivial server program that listens for TCPconnections on port 9995. When they arrive, it writes a short message toeach client connection, and closes each connection once it is flushed.Where possible, it exits cleanly in response to a SIGINT (ctrl-c).
*/#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <signal.h>
#ifndef _WIN32
#include <netinet/in.h>
# ifdef _XOPEN_SOURCE_EXTENDED
# include <arpa/inet.h>
# endif
#include <sys/socket.h>
#endif#include <event2/bufferevent.h>
#include <event2/buffer.h>
#include <event2/listener.h>
#include <event2/util.h>
#include <event2/event.h>static const char MESSAGE[] = "Hello, World!\n";static const int PORT = 9995;static void listener_cb(struct evconnlistener *, evutil_socket_t,struct sockaddr *, int socklen, void *);
static void conn_writecb(struct bufferevent *, void *);
static void conn_eventcb(struct bufferevent *, short, void *);
static void signal_cb(evutil_socket_t, short, void *);int
main(int argc, char **argv)
{struct event_base *base;struct evconnlistener *listener;struct event *signal_event;struct sockaddr_in sin;
#ifdef _WIN32WSADATA wsa_data;WSAStartup(0x0201, &wsa_data);
#endifbase = 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);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;}signal_event = evsignal_new(base, SIGINT, signal_cb, (void *)base);if (!signal_event || event_add(signal_event, NULL)<0) {fprintf(stderr, "Could not create/add a signal event!\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 = user_data;struct bufferevent *bev;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, NULL, conn_writecb, conn_eventcb, NULL);bufferevent_enable(bev, EV_WRITE);bufferevent_disable(bev, EV_READ);bufferevent_write(bev, MESSAGE, strlen(MESSAGE));
}static void
conn_writecb(struct bufferevent *bev, void *user_data)
{struct evbuffer *output = bufferevent_get_output(bev);if (evbuffer_get_length(output) == 0) {printf("flushed answer\n");bufferevent_free(bev);}
}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);
}static void
signal_cb(evutil_socket_t sig, short events, void *user_data)
{struct event_base *base = user_data;struct timeval delay = { 2, 0 };printf("Caught an interrupt signal; exiting cleanly in two seconds.\n");event_base_loopexit(base, &delay);
}
设置好链接库的路径和链接库
写一个简单的client端,代码如下:
// sample_tcpclient.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include <stdio.h>
#include <Winsock2.h>
#include <mstcpip.h>#pragma comment(lib,"ws2_32.lib")#define _WINSOCK_DEPRECATED_NO_WARNINGSint main(int argc, char* argv[])
{WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(1, 1);err = WSAStartup(wVersionRequested, &wsaData);if (err != 0) {printf("WSAStartup failed:%d\n", err);getchar();exit(0);}if (LOBYTE(wsaData.wVersion) != 1 ||HIBYTE(wsaData.wVersion) != 1) {WSACleanup();printf("version error\n");getchar();exit(0);}
lab_start:SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.2.41");addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(9995);int ret = connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));if (ret != 0){printf("connect failed:%d\n", ret);return -1;}// 开启KeepAliveBOOL bKeepAlive = TRUE;int nRet = ::setsockopt(sockClient, SOL_SOCKET, SO_KEEPALIVE, (char*)&bKeepAlive, sizeof(bKeepAlive));if (nRet == SOCKET_ERROR){printf("setsockopt error:%d\n", nRet);return -1;}// 设置KeepAlive参数tcp_keepalive alive_in = { 0 };tcp_keepalive alive_out = { 0 };alive_in.keepalivetime = 5000; // 开始首次KeepAlive探测前的TCP空闭时间alive_in.keepaliveinterval = 1000; // 两次KeepAlive探测间的时间间隔alive_in.onoff = TRUE;unsigned long ulBytesReturn = 0;nRet = WSAIoctl(sockClient, SIO_KEEPALIVE_VALS, &alive_in, sizeof(alive_in),&alive_out, sizeof(alive_out), &ulBytesReturn, NULL, NULL);if (nRet == SOCKET_ERROR){printf("WSAIoctl error:%d\n", nRet);return -1;}//disable nagleint on = 1;/* make socket here */
#ifdef WIN32 setsockopt(sockClient, IPPROTO_TCP, TCP_NODELAY, (const char *)&on, sizeof(on));
#else setsockopt(sockClient, IPPROTO_TCP, TCP_NODELAY, (void *)&on, sizeof(on));
#endif const char *data_str = "hello world, i am client";int data_len = strlen(data_str)+1;for (int i = 0; i < 10; i++){ret = send(sockClient, data_str + (data_len - data_len % 1024), data_len % 1024, 0);if (ret < 0){printf("send error:%d\n", ret);break;}printf("data_len:%d count:%d ret:%d\n", data_len, i, ret);char recvBuf[256];ret = ::recv(sockClient, recvBuf, 256, 0);if (ret < 0){printf("recv error:%d\n", ret);break;}recvBuf[ret] = '\0';printf("ret:%d recv:%s\n", ret, recvBuf);Sleep(3000);}closesocket(sockClient);getchar();closesocket(sockClient);WSACleanup();
}
然后就是连接成功了:
Visual Studio 2017开发linux程序之libevent使用实例相关推荐
- Visual Studio 2017开发linux程序使用实例及原理简析
1.下载安装vs开发linux程序的工具包 2.创建一个工程,选择跨平台里面的linux平台 3.写一段测试代码,这里就可以包含linux的系统头文件编译,不过vs下还是现实红的 #include & ...
- 如何用 Visual Studio 2017 开发 Arduino 应用程序
如何用 Visual Studio 2017 开发 Arduino 应用程序 使用Visual Studio 2017 开发 Arduino 应用程序需要两个软件: Visual Studio Vis ...
- 使用 Visual Studio 2022 开发 Linux C++ 应用程序
使用 Visual Studio 2022 开发 Linux C++ 应用程序 前置条件: Windows上需要先安装 WSL2,方法见: Install WSL | Microsoft Docs 在 ...
- DCMTK 3.6.2(MD支持库)与Microsoft Visual Studio 2017开发环境的搭建
DCMTK 3.6.2(MD支持库)与Microsoft Visual Studio 2017开发环境的搭建 DCMTK 362MD支持库与Microsoft Visual Studio 2017开发 ...
- 使用Visual Studio 2017开发Windows UWP应用
使用Visual Studio 2017开发Windows UWP应用 今天开始学习Windows UWP应用开发 学习的视频资料来自Bilibili上"微软信仰中心"添加翻译字幕 ...
- vs2017 linux工程设置头文件,使用Visual Studio 2017作为Linux C++开发工具
Visual Studio 2017 VS2017亮点很多,包括模块化安装.启动速度加快(第一次启动加快50%以上).github插件.启动页完善.增强代码提示功能,等等,更多参考:https://w ...
- 使用Visual Studio 2017作为Linux C++开发工具
Visual Studio 2017 微软的宇宙第一IDE Visual Studio 2017正式版出来了,地址是:https://www.visualstudio.com/vs/whatsnew/ ...
- Visual Studio 2017 - Windows应用程序打包成exe文件(1)- 工具简单总结
最近有对一个Windows应用程序少许维护和修改.修改之后要发布新的exe安装文件,打包exe文件时,遇到了很头疼的问题,还好最后解决了,记录一下. Visual Studio版本:Visual St ...
- 使用Visual Studio Code开发.NET程序
Visual Studio Code 成为个人使用频率最高的应用程序了,层出不穷的插件为 Code 的应用场景提供了无限可能.本文介绍在 Visual Studio Code 中开发 .NET 程序的 ...
最新文章
- 齐鲁师范学院计算机专业在那个校区,齐鲁师范学院有几个校区及校区地址 哪个校区最好...
- jQuery与其它库冲突的解决方法(转)
- Ubuntu 忘记root登录密码的解决办法
- button 与 input type=button 的区别【2012/07/23】
- extern 用法,全局变量与头文件(重复定义)
- LeetCode 112. 路径总和 、113. 路径总和 II 思考分析
- 初入门-游戏设计思路拆解
- 李秋豪计算机系统,CS:APP3e 深入理解计算机系统_3e Y86-64模拟器指南
- webpack性能优化
- java ini_Java操作Ini文件
- 酒店网络营销的5C时代-德比软件 张焕杰
- 个性测试:跟乐嘉学性格色彩(图)
- 记一道80%的人会答错的牛X面试题!
- 捣乱姬使用说明 版本0.0.2
- java版我的世界光追,光追有多神奇?我的世界VS别人的世界
- matlab julia分形图,Mandelbrot集和Julia集的分形图之matlab实现
- 个人主页博客网页设计制作HTML5+CSS大作业——个人相册展示留言博客模板(6页) 简单个人网页制作
- Redis到底是什么?
- Python爬虫学习第三章-4.3-使用xpath解析爬取全国城市名称
- 在AS中引用第三方java类库含源代码包
热门文章
- python的sorted函数用法_Python sorted函数及用法
- android 获取monkey日志_APP压力测试定位问题_monkey篇
- 4.在master机器上配置环境变量
- 【自动驾驶】相机标定 疑问总结
- 今天开始学模式识别与机器学习Pattern Recognition and Machine Learning (PRML),章节1.2,Probability Theory (下)
- 从软件工程的角度解读任正非的新年公开信
- Mybatis通用Mapper
- mysql的最佳索引攻略
- 让书写的Matlab代码运行更快 Recipes for Faster Matlab Code
- 装完Ubuntu后要干的事-安装常用软件