linux epoll監聽套接字例項

2021-08-20 12:30:31 字數 2890 閱讀 6770

linux epoll機制用於io多路復用,能夠同時監聽多個接字,使用起來比較簡單。

#include int epoll_create(int size);

int epoll_create1(int flags); //建立epoll例項

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); //新增、刪除或修改epoll監聽描述符

int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);//監聽事件發生

其中epoll_ctl引數op有如下選項:分別對應新增、刪除、修改

epoll_ctl_add,epoll_ctl_mod,epoll_ctl_del
//結構體,在新增到epoll中去的時候可以傳遞引數,引數可以是指標
typedef union epoll_data  epoll_data_t;

struct epoll_event ;

下面給出乙個簡單的使用例子,在例子中建立了兩個套接字,分別監聽不同的埠,將兩個套接字新增到epoll中,每當套接字上有讀事件發生的時候,就可以進行處理。

/*

* description : linux io多路復用epoll例項

* date :20180605

* author :mason

* mail : [email protected]

* */

#include #include #include #include #include #include #include #include #include #include #define buffer_size 512

#define log(fmt, arg...) printf("[udptest] %s:%d "fmt, __function__, __line__, ##arg)

void main();

struct sockaddr_in addr1, addr2;

// 建立套接字1

fd1 = socket(af_inet, sock_dgram, 0);

if (fd1 == -1)

// 建立套接字2

fd2 = socket(af_inet, sock_dgram, 0);

if (fd2 == -1)

// 設定監聽位址,不同套接字監聽不同的位址

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)))

if (0 != bind(fd2, (struct sockaddr *)&addr2, sizeof(struct sockaddr_in)))

//建立epoll例項

efd = epoll_create1(0);

if (efd == -1)

log("create epoll instance success \r\n");

epoll_events_ptr = (struct epoll_event *)calloc(2, sizeof(struct epoll_event));

if (epoll_events_ptr == null)

//新增套接字到epoll中,並監控讀事件

//注意這裡傳給epoll的引數中可以是指標

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);

//監聽epoll事件

while(1) {

log("starting waiting epoll event \n");

fds = epoll_wait(efd, epoll_events_ptr, 2, -1); //阻塞

for (i = 0; i

測試結果:

有一點值得注意的是,我在測試用例中當收到epoll事件的時候直接進行了讀取操作,實際應用中這一步可能會阻塞,更好的做法是收到事件傳送訊息到相關的執行緒或者是訊息佇列中,由它們來進行業務處理,epoll只負責通知,這樣能夠提高處理速度。

**可以在gihub上轉殖:

[email protected]:fuyuande/epoll.git

監聽套接字 連線套接字

摘要 對於伺服器程式設計中最重要的一步等待並接受客戶的連線,那麼這一步在程式設計中如何完成,accept函式就是完成這一步的。它從核心中取出已經建立的客戶連線,然後把這個已經建立的連線返回給使用者程式,此時使用者程式就可以與自己的客戶進行點到點的通訊了。accept函式等待並接受客戶請求 inclu...

監聽套接字 連線套接字的區別

摘要 對於伺服器程式設計中最重要的一步等待並接受客戶的連線,那麼這一步在程式設計中如何完成,accept函式就是完成這一步的。它從核心中取出已經建立的客戶連線,然後把這個已經建立的連線返回給使用者程式,此時使用者程式就可以與自己的客戶進行點到點的通訊了。accept函式等待並接受客戶請求 inclu...

TCP如何區分監聽套接字和已連線套接字???

2010 10 09 10 39 868人閱讀收藏 tcp伺服器 wildcard freebsd socket 2010 2.10 tcp埠號與併發伺服器 併發伺服器中主伺服器迴圈通過派生乙個子程序來處理每個新的連線。如果乙個子程序繼續使用伺服器眾所周知的埠來服務乙個長時間的請求,那將發生什麼?讓...