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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux epoll监听套接字实例

發(fā)布時(shí)間:2025/4/5 linux 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux epoll监听套接字实例 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

linux epoll機(jī)制用于IO多路復(fù)用,能夠同時(shí)監(jiān)聽(tīng)多個(gè)接字,使用起來(lái)比較簡(jiǎn)單。

相關(guān)接口:

#include <sys/epoll.h>int epoll_create(int size);int epoll_create1(int flags); //創(chuàng)建epoll實(shí)例int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); //添加、刪除或修改epoll監(jiān)聽(tīng)描述符int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);//監(jiān)聽(tīng)事件發(fā)生

其中epoll_ctl參數(shù)op有如下選項(xiàng):分別對(duì)應(yīng)添加、刪除、修改

EPOLL_CTL_ADD,EPOLL_CTL_MOD,EPOLL_CTL_DEL ???????????? //結(jié)構(gòu)體,在添加到epoll中去的時(shí)候可以傳遞參數(shù),參數(shù)可以是指針 typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64;} epoll_data_t;struct epoll_event {uint32_t events; /* Epoll events */epoll_data_t data; /* User data variable */};

下面給出一個(gè)簡(jiǎn)單的使用例子,在例子中創(chuàng)建了兩個(gè)套接字,分別監(jiān)聽(tīng)不同的端口,將兩個(gè)套接字添加到epoll中,每當(dāng)套接字上有讀事件發(fā)生的時(shí)候,就可以進(jìn)行處理。

/** Description : linux IO多路復(fù)用epoll實(shí)例* Date :20180605* Author :mason* Mail : mrsonko@126.com**/#include <netinet/in.h> #include <sys/socket.h> #include <sys/epoll.h> #include <sys/types.h> #include <arpa/inet.h> #include <sys/errno.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <stdio.h>#define BUFFER_SIZE 512 #define log(fmt, arg...) printf("[udptest] %s:%d "fmt, __FUNCTION__, __LINE__, ##arg)void main(){int fd1, fd2, efd, fds, i, fd;int ret, addr_len;struct epoll_event g_event; // epoll事件struct epoll_event *epoll_events_ptr; char buffer[BUFFER_SIZE] = {0};struct sockaddr_in addr1, addr2;// 創(chuàng)建套接字1fd1 = socket(AF_INET, SOCK_DGRAM, 0);if (fd1 == -1) {log("create socket fail \r\n");return ;} // 創(chuàng)建套接字2 fd2 = socket(AF_INET, SOCK_DGRAM, 0);if (fd2 == -1) {log("create socket fail \r\n");close(fd1);return ;} // 設(shè)置監(jiān)聽(tīng)地址,不同套接字監(jiān)聽(tīng)不同的地址addr1.sin_family = AF_INET;addr1.sin_addr.s_addr = INADDR_ANY; addr1.sin_port = htons(3500);addr2.sin_family = AF_INET;addr2.sin_addr.s_addr = INADDR_ANY; addr2.sin_port = htons(3501);addr_len = sizeof(struct sockaddr_in);// 套接字綁定地址if (0 != bind(fd1, (struct sockaddr *)&addr1, sizeof(struct sockaddr_in))) {log("bind local listening addr fail,errno : %d \r\n", errno);goto err;}if (0 != bind(fd2, (struct sockaddr *)&addr2, sizeof(struct sockaddr_in))) {log("bind local listening addr fail,errno : %d \r\n", errno);goto err;}//創(chuàng)建epoll實(shí)例efd = epoll_create1(0);if (efd == -1) {log("create epoll fail \r\n");goto err;}log("create epoll instance success \r\n");epoll_events_ptr = (struct epoll_event *)calloc(2, sizeof(struct epoll_event));if (epoll_events_ptr == NULL) {log("calloc fail \r\n");goto err;}//添加套接字到epoll中,并監(jiān)控讀事件//注意這里傳給epoll的參數(shù)中可以是指針g_event.data.fd = fd1; g_event.events = EPOLLIN;epoll_ctl(efd, EPOLL_CTL_ADD, fd1, &g_event); g_event.data.fd = fd2; g_event.events = EPOLLIN;epoll_ctl(efd, EPOLL_CTL_ADD, fd2, &g_event); //監(jiān)聽(tīng)epoll事件while(1) {log("Starting waiting epoll event \n");fds = epoll_wait(efd, epoll_events_ptr, 2, -1); //阻塞for (i = 0; i<fds; i++){ fd = epoll_events_ptr[i].data.fd;if (epoll_events_ptr[i].events & EPOLLIN){ ret = read(fd, buffer, BUFFER_SIZE);if(ret != -1)log("recv msg : %s \n", buffer);} memset(buffer, 0, BUFFER_SIZE);} } err:close(fd1);close(fd2);if(epoll_events_ptr) free(epoll_events_ptr);return ;}

測(cè)試結(jié)果:

有一點(diǎn)值得注意的是,我在測(cè)試用例中當(dāng)收到epoll事件的時(shí)候直接進(jìn)行了讀取操作,實(shí)際應(yīng)用中這一步可能會(huì)阻塞,更好的做法是收到事件發(fā)送消息到相關(guān)的線程或者是消息隊(duì)列中,由它們來(lái)進(jìn)行業(yè)務(wù)處理,epoll只負(fù)責(zé)通知,這樣能夠提高處理速度。

代碼可以在gihub上克隆:

git@github.com:FuYuanDe/epoll.git

參考資料:

http://www.man7.org/linux/man-pages/man7/epoll.7.html

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的linux epoll监听套接字实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。