linux網路程式設計之 epoll

2021-08-09 18:47:23 字數 1505 閱讀 2283

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

#define maxline 5

#define open_max 100

#define listenq 20

#define serv_port 5000

#define inftim 1000

void setnonblocking(int sock)

opts = opts|o_nonblock;

if(fcntl(sock,f_setfl,opts)<0)

}void closeanddisable(int sockid, epoll_event ee)

int main()

char *str = inet_ntoa(clientaddr.sin_addr);

cout << "accapt a connection from " << str << endl;

//設定用於讀操作的檔案描述符

setnonblocking(connfd);

ev.data.fd=connfd;

//設定用於注測的讀操作事件

ev.events=epollin | epollet;

//註冊ev

epoll_ctl(epfd,epoll_ctl_add,connfd,&ev);

}else if(events[i].events & epollin)//如果是已經連線的使用者,並且收到資料,那麼進行讀入。

else if (errno == econnreset)

else if (errno == eintr)

else

}else if( recvnum == 0)

// recvnum > 0

count += recvnum;

if ( recvnum == maxline)

else // 0 < recvnum < maxline

}if (breadok == true)

}else if(events[i].events & epollout) // 如果有資料傳送

else if(errno == econnreset)

else if (errno == eintr)

else

}if (writenlen == 0)

// 以下的情況是writenlen > 0

count += writenlen;

if (writenlen == maxline)

else // 0 < writenlen < maxline

}if (bwritten == true)}}

}return 0;

}

高併發網路程式設計之epoll詳解

核心 使用者空間記憶體拷貝問題,select需要複製大量的控制代碼資料結構,產生巨大的開銷 select返回的是含有整個控制代碼的陣列,應用程式需要遍歷整個陣列才能發現哪些控制代碼發生了事件 select的觸發方式是水平觸發,應用程式如果沒有完成對乙個已經就緒的檔案描述符進行io操作,那麼之後每次s...

高併發網路程式設計之epoll詳解

核心 使用者空間記憶體拷貝問題,select需要複製大量的控制代碼資料結構,產生巨大的開銷 select返回的是含有整個控制代碼的陣列,應用程式需要遍歷整個陣列才能發現哪些控制代碼發生了事件 select的觸發方式是水平觸發,應用程式如果沒有完成對乙個已經就緒的檔案描述符進行io操作,那麼之後每次s...

Linux網路程式設計之廣播

1.概念 前面介紹的tcp,udp都是單播方式,即一對一.而廣播是一台主機向區域網內的所有主機傳送資料。這時,同一網段的所有主機都能接收到資料。傳送廣播包的步驟大致如下 1 確定乙個傳送廣播的介面,如eth0 2 確定廣播的位址,通過ioctl函式,請求碼設定為siocgifbrdaddr得到廣播的...