下载源码编译安装后,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使用实例相关推荐

  1. Visual Studio 2017开发linux程序使用实例及原理简析

    1.下载安装vs开发linux程序的工具包 2.创建一个工程,选择跨平台里面的linux平台 3.写一段测试代码,这里就可以包含linux的系统头文件编译,不过vs下还是现实红的 #include & ...

  2. 如何用 Visual Studio 2017 开发 Arduino 应用程序

    如何用 Visual Studio 2017 开发 Arduino 应用程序 使用Visual Studio 2017 开发 Arduino 应用程序需要两个软件: Visual Studio Vis ...

  3. 使用 Visual Studio 2022 开发 Linux C++ 应用程序

    使用 Visual Studio 2022 开发 Linux C++ 应用程序 前置条件: Windows上需要先安装 WSL2,方法见: Install WSL | Microsoft Docs 在 ...

  4. DCMTK 3.6.2(MD支持库)与Microsoft Visual Studio 2017开发环境的搭建

    DCMTK 3.6.2(MD支持库)与Microsoft Visual Studio 2017开发环境的搭建 DCMTK 362MD支持库与Microsoft Visual Studio 2017开发 ...

  5. 使用Visual Studio 2017开发Windows UWP应用

    使用Visual Studio 2017开发Windows UWP应用 今天开始学习Windows UWP应用开发 学习的视频资料来自Bilibili上"微软信仰中心"添加翻译字幕 ...

  6. vs2017 linux工程设置头文件,使用Visual Studio 2017作为Linux C++开发工具

    Visual Studio 2017 VS2017亮点很多,包括模块化安装.启动速度加快(第一次启动加快50%以上).github插件.启动页完善.增强代码提示功能,等等,更多参考:https://w ...

  7. 使用Visual Studio 2017作为Linux C++开发工具

    Visual Studio 2017 微软的宇宙第一IDE Visual Studio 2017正式版出来了,地址是:https://www.visualstudio.com/vs/whatsnew/ ...

  8. Visual Studio 2017 - Windows应用程序打包成exe文件(1)- 工具简单总结

    最近有对一个Windows应用程序少许维护和修改.修改之后要发布新的exe安装文件,打包exe文件时,遇到了很头疼的问题,还好最后解决了,记录一下. Visual Studio版本:Visual St ...

  9. 使用Visual Studio Code开发.NET程序

    Visual Studio Code 成为个人使用频率最高的应用程序了,层出不穷的插件为 Code 的应用场景提供了无限可能.本文介绍在 Visual Studio Code 中开发 .NET 程序的 ...

最新文章

  1. 齐鲁师范学院计算机专业在那个校区,齐鲁师范学院有几个校区及校区地址 哪个校区最好...
  2. jQuery与其它库冲突的解决方法(转)
  3. Ubuntu 忘记root登录密码的解决办法
  4. button 与 input type=button 的区别【2012/07/23】
  5. extern 用法,全局变量与头文件(重复定义)
  6. LeetCode 112. 路径总和 、113. 路径总和 II 思考分析
  7. 初入门-游戏设计思路拆解
  8. 李秋豪计算机系统,CS:APP3e 深入理解计算机系统_3e Y86-64模拟器指南
  9. webpack性能优化
  10. java ini_Java操作Ini文件
  11. 酒店网络营销的5C时代-德比软件 张焕杰
  12. 个性测试:跟乐嘉学性格色彩(图)
  13. 记一道80%的人会答错的牛X面试题!
  14. 捣乱姬使用说明 版本0.0.2
  15. java版我的世界光追,光追有多神奇?我的世界VS别人的世界
  16. matlab julia分形图,Mandelbrot集和Julia集的分形图之matlab实现
  17. 个人主页博客网页设计制作HTML5+CSS大作业——个人相册展示留言博客模板(6页) 简单个人网页制作
  18. Redis到底是什么?
  19. Python爬虫学习第三章-4.3-使用xpath解析爬取全国城市名称
  20. 在AS中引用第三方java类库含源代码包

热门文章

  1. python的sorted函数用法_Python sorted函数及用法
  2. android 获取monkey日志_APP压力测试定位问题_monkey篇
  3. 4.在master机器上配置环境变量
  4. 【自动驾驶】相机标定 疑问总结
  5. 今天开始学模式识别与机器学习Pattern Recognition and Machine Learning (PRML),章节1.2,Probability Theory (下)
  6. 从软件工程的角度解读任正非的新年公开信
  7. Mybatis通用Mapper
  8. mysql的最佳索引攻略
  9. 让书写的Matlab代码运行更快 Recipes for Faster Matlab Code
  10. 装完Ubuntu后要干的事-安装常用软件