基於epoll的簡單服務器

1、epolllinux

    1.epoll只有epoll_create,epoll_ctl,epoll_wait 3個系統調用編程

    (1)int epoll_create(int size); 數組

    建立一個epoll的句柄。自從linux2.6.8以後,size參數是被忽略的。須要注意的是,當建立好epoll句柄後,它就是會佔用一個fd值,在linux下若是查看/proc/進程id/fd/,是可以看到這個fd的,因此在使用完epoll後,必須調用close()關閉,不然可能致使fd被耗盡。 瀏覽器

    (2)int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);socket

    epoll的事件註冊函數,它不一樣於select()是在監聽事件時告訴內核要監聽什麼類型的事件,而是在這裏先註冊要監聽的事件類型。ide

    a.第一個參數是epoll_create()的返回值。 函數

    b.第二個參數表示動做,用三個宏來表示: 測試

    EPOLL_CTL_ADD:註冊新的fd到epfd中;spa

    EPOLL_CTL_MOD:修改已經註冊的fd的監聽事;3d

    EPOLL_CTL_DEL:從epfd中刪除一個fd; 

    c.第三個參數是須要監聽的fd。

    d.第四個參數是告訴內核須要監聽什麼事,struct epoll_event結構以下:

wKioL1ecdsHC0wi5AAA0Ku1Oe_E425.jpg-wh_50

    (3)int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);     

    收集在epoll監控的事件中已經發送的事件。參數events是分配好的epoll_event結構體數組,epoll將會把發生的事件賦值到events數組中(events不能夠是空指針,內核只負責把數據復 制到這個events數組中,不會去幫助咱們在用戶態中分配內存)。maxevents告以內核這個 events有多大,這個 maxevents的值不能大於建立epoll_create()時的size,參數timeout是超時 時間(毫秒,0會當即返回,-1將不肯定,也有說法說是永久阻塞)。若是函數調用成功,返回對應I/O上已準備好的文件描述符數目,如返回0表示已超時。

    2.Epoll的2種工做方式-水平觸發(LT)和邊緣觸發(ET) 

    LT(level triggered)是epoll缺省的工做方式,而且同時支持block和no-block socket.在這種作法中,內核告訴你一個文件描述符是否就緒了,而後你能夠對這個就緒的fd進行IO操做。若是你不做任何操做,內核仍是會繼續通知你的,因此,這種模式編程出錯誤可能性要小一點。傳統的select/poll都是這種模型的表明. 

    ET (edge-triggered)是高速工做方式,只支持no-block socket,它效率要比LT更高。ET與LT的區別在於,當一個新的事件到來時,ET模式下固然能夠從epoll_wait調用中獲取到這個事件,但是若是此次沒有把這個事件對應的套接字緩衝區處理完,在這個套接字中沒有新的事件 再次到來時,在ET模式下是沒法再次從epoll_wait調用中獲取這個事件的。而LT模式正好相反,只要一個事件對應的套接字緩衝區還有數據,就總能從epoll_wait中獲取這個事件。所以,LT模式下開發基於epoll的應用要簡單些,不太容易出錯。而在ET模式下事件發生時,若是沒有完全地將緩衝區數據處理完,則會致使緩衝區中的用戶請求得不到響應。 

2、代碼實現

wKiom1ecpATTlqfEAABg5EH6Cik069.jpg-wh_50

wKioL1ecpATgyeJ4AABsZKlFp6A262.jpg-wh_50

wKioL1ecpAXjkWtdAABOX4W4EpY305.jpg-wh_50

wKiom1ecpAWh1m4IAABhCV8iv_s114.jpg-wh_50

wKiom1ecpAaAYbqkAABzy0LIqXs566.jpg-wh_50

wKioL1ecpAbSrhj5AABgy4tTtZI271.jpg-wh_50

wKioL1ecpAfiA2BQAABR4Ar8CWw517.jpg-wh_50

3、結果顯示

    1.通訊結果

wKioL1ecpB3TQOgDAAAi4LYGX0o206.jpg-wh_50

wKiom1ecpB3QAwdqAAAguFJjP7g485.jpg-wh_50

    2.用瀏覽器測試簡單http消息回顯。 

wKiom1ecpDTQxowLAABiYvtVWqA843.jpg-wh_50

相關文章
相關標籤/搜索