日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Visual Studio 2017开发linux程序之libevent使用实例

發布時間:2025/3/21 linux 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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使用实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美视频在线观看免费 | 日本高清视频一区二区 | 久久精品蜜桃 | 日韩欧美在线观看一区二区 | 后入内射欧美99二区视频 | 亚洲第一区视频 | 日日摸天天爽天天爽视频 | 毛片少妇 | 国产一级二级三级在线观看 | 人人爽人人爽人人片 | 99久久人妻无码中文字幕系列 | 色女综合| 肉丝美足丝袜一区二区三区四 | 国产成人a v | 少妇激情偷人爽爽91嫩草 | 青青草.com| 日韩一级黄 | 亚洲精品一区二区在线观看 | 我和岳m愉情xxxⅹ视频 | 亚洲日本在线播放 | 欧美日韩一区二区三区免费 | 欧美自拍区| 日日噜噜噜夜夜爽爽狠狠视频97 | 在线中文字幕一区 | 神马久久久久久 | www.操| 五月天婷婷色 | 嫩草午夜少妇在线影视 | 久久影院国产 | 少妇久久久久久被弄到高潮 | 99在线精品视频 | 色天使在线视频 | 99自拍偷拍视频 | 国产毛片久久 | 国产精品一国产精品 | 爱涩av | 黄色国产一区 | 末发成年娇小性xxxxx | 日韩专区一区 | 91色在线播放 | 人人看人人干 | 牛牛精品视频 | 久久亚洲综合国产精品99麻豆精品福利 | 国产人妻久久精品一区二区三区 | 光溜溜视频素材大全美女 | 久久极品 | 亚洲色图36p| 久草大 | 波多在线观看 | 蜜桃视频在线观看一区 | a天堂视频在线观看 | 午夜嘿嘿嘿 | 国产三级国产精品国产专区50 | 漂亮人妻被中出中文字幕 | 精品人妻一区二区三区视频 | 成人免费xxxxx在线观看 | 国产在线高潮 | 打屁股疼的撕心裂肺的视频 | 亚洲精品ww | 狠狠躁天天躁夜夜躁婷婷 | 日本www在线 | 九一国产在线 | 国产又黄又粗又猛又爽 | 午夜影院免费体验区 | 亚洲一区二区三区激情 | 在线观看免费高清在线观看 | 天天摸天天操天天干 | 欧美色性视频 | 小小姑娘电影大全免费播放 | 欧洲日韩一区二区三区 | 免费一级a毛片夜夜看 | 丁香花婷婷| 国产精品自慰网站 | 专干老肥女人88av | 俺来也俺也啪www色 欧洲一区二区视频 | 六月激情综合网 | 久久青青草原亚洲av无码麻豆 | 成人亚洲网 | 四虎精品一区二区 | 欧美成人免费观看视频 | av色图 | 亚洲精品视频免费 | 林雅儿欧洲留学恋爱日记在线 | 999成人网 | 亚洲视频免费在线播放 | 久久亚洲精品中文字幕 | 欧美日韩中文字幕一区二区 | 手机av在线网 | 久久精品视频18 | 天堂在线观看中文字幕 | 欧美精品第一页 | 天堂网avav| 亚洲色图一区二区 | av免费在线电影 | mm1313亚洲国产精品美女 | 无遮挡边吃摸边吃奶边做 | 国产高清不卡一区 | 欧美性受xxxx黑人xyx性爽 | 欧美日在线 |