亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2819 | 回復(fù): 5
打印 上一主題 下一主題

[Linux] Linux下epoll的一些問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2015-06-28 09:08 |只看該作者 |倒序瀏覽
小弟使用EPOLLIN來觸發(fā)可讀事件,按照網(wǎng)上說的,ET模式下,只有緩沖區(qū)從不可讀變成可讀才會觸發(fā)EPOLLIN時間,可現(xiàn)在寫了一個測試程序,客戶端每次發(fā)多個字節(jié),服務(wù)器每次只收一個字節(jié),但每次都會觸發(fā)EPOLLIN事件,如果只收一個字節(jié),緩沖區(qū)還有數(shù)據(jù),下次發(fā)送就應(yīng)該不會再觸發(fā)EPOLLIN事件(ET模式下),服務(wù)端代碼如下:
  1. #include <iostream>
  2. #include <cstring>
  3. #include <sys/epoll.h>
  4. #include <unistd.h>
  5. #include <sys/socket.h>
  6. #include <arpa/inet.h>
  7. #include <netinet/in.h>
  8. #include <errno.h>
  9. #include <fcntl.h>

  10. int main(void)
  11. {
  12.     int serfd = socket(AF_INET, SOCK_STREAM, 0);
  13.     int clifd;
  14.     int ret;
  15.     if(serfd < 0)
  16.         std::cout << "Create serfd fail!\n";

  17.     struct sockaddr_in cliaddr, seraddr;
  18.     bzero(&seraddr, sizeof(seraddr));
  19.     seraddr.sin_family = AF_INET;
  20.     seraddr.sin_port = htons(12439);
  21.     seraddr.sin_addr.s_addr = inet_addr("0.0.0.0");
  22.     int on = 1;
  23.     setsockopt(serfd, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof(on));
  24.     bind(serfd, (struct sockaddr*)&seraddr, sizeof(seraddr));
  25.     listen(serfd, 20);

  26.     socklen_t len = sizeof(cliaddr);
  27.     bzero(&cliaddr, sizeof(seraddr));
  28.     clifd = accept(serfd, (struct sockaddr*)&cliaddr, &len);
  29.     if(clifd < -1){
  30.         std::cout << strerror(errno) << std::endl;
  31.         close(serfd);
  32.         return 0;
  33.     }

  34.     fcntl(clifd, F_SETFL, O_NONBLOCK);

  35.     //Create epoll
  36.     int epfd = epoll_create(1024);
  37.     struct epoll_event ev;
  38.     struct epoll_event events[1024];
  39.     ev.events = EPOLLET | EPOLLIN ;
  40.     ev.data.fd = clifd;
  41.     epoll_ctl(epfd, EPOLL_CTL_ADD, clifd, &ev);

  42.     while(1)
  43.     {
  44.         int num = epoll_wait(epfd, events, 1024, -1);
  45.         char buf[1024] = {0};
  46.         for(int i = 0; i < num; i++)
  47.         {
  48.             if(events[i].events & EPOLLIN){
  49.                 std::cout << "Ready to read!\n";
  50.                 std::cout << "size=" << read(events[i].data.fd, buf, 1)
  51.                           << "\tbuf=[" << buf << ']' << std::endl;
  52.             }
  53.             if(events[i].events & EPOLLOUT){
  54.                 std::cout << "Ready to write!\n";
  55.             }
  56.         }

  57.     }
  58.     return 0;
  59. }

復(fù)制代碼
客戶端使用: nc 來連接,并發(fā)送數(shù)據(jù),第一次發(fā)了abcd,觸發(fā)了EPOLLIN,但服務(wù)器只收一個字節(jié),第二次發(fā)了ef,依然觸發(fā)了EPOLLIN。

服務(wù)器端的接收情況:

此外:如果我注冊的時候是EPOLLET|EPOLLOUT ,為什么這個EPOLLOUT每次都會觸發(fā)?
謝謝各位!

論壇徽章:
16
CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:3415-16賽季CBA聯(lián)賽之廣東
日期:2015-12-23 21:21:55青銅圣斗士
日期:2015-12-05 10:35:30黃金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日論壇發(fā)貼之星
日期:2015-11-18 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-11-18 06:20:002015亞冠之城南
日期:2015-11-10 19:10:492015亞冠之薩濟拖拉機
日期:2015-10-28 18:47:282015亞冠之柏太陽神
日期:2015-08-30 17:21:492015亞冠之山東魯能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
2 [報告]
發(fā)表于 2015-06-28 11:30 |只看該作者
hi,
按照EPOLLET 代碼實現(xiàn),應(yīng)該是如果你沒有讀取完畢
并且底層驅(qū)動也沒有數(shù)據(jù)發(fā)送過來的哈。
這時候你的epoll_wait 是不能等待相關(guān)的事件啦。
例如,你在讀取一個字節(jié)后,你客服端不發(fā)送消息過來,那么你在epoll_wait
對應(yīng)的文件符 是一直沒有相應(yīng)的事件報告的(在EPOLLET模式下)
如果你不使用EPOLLET模式,那么你在讀取一個字節(jié)后,再次epoll_wait,
即使你的客服端不發(fā)送消息,也會有讀事件報告的(因為你還有數(shù)據(jù)沒讀完)

論壇徽章:
0
3 [報告]
發(fā)表于 2015-06-28 12:29 |只看該作者
回復(fù) 2# tc1989tc
嗯,是的,比如我客戶端傳了5個字節(jié),epoll服務(wù)器第一次觸發(fā)EPOLLIN的時候,我只收了1個字節(jié),
這樣的話,不是還有4個字節(jié)留在內(nèi)核緩沖區(qū)中嗎(網(wǎng)上說要觸發(fā)EPOLLIN,一直要讀到返回EAGAIN錯誤)?
下次客戶端再發(fā)數(shù)據(jù),由于是EPOLLET的,但此時內(nèi)核緩沖區(qū)不為空(還有4個字節(jié)),沒有從不可讀變成可讀,那它應(yīng)該不會再次觸發(fā)EPOLLIN。
可我現(xiàn)在做的測試結(jié)果,剛好相反!
   

論壇徽章:
16
CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:3415-16賽季CBA聯(lián)賽之廣東
日期:2015-12-23 21:21:55青銅圣斗士
日期:2015-12-05 10:35:30黃金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日論壇發(fā)貼之星
日期:2015-11-18 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-11-18 06:20:002015亞冠之城南
日期:2015-11-10 19:10:492015亞冠之薩濟拖拉機
日期:2015-10-28 18:47:282015亞冠之柏太陽神
日期:2015-08-30 17:21:492015亞冠之山東魯能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
4 [報告]
發(fā)表于 2015-06-28 15:26 |只看該作者
看linux的evenepoll.c 里面的實現(xiàn)  
和你測試的結(jié)果是一致的。
它只保證啦一次報文的邊緣觸發(fā)
也就是驅(qū)動有報文來  有等待隊列 他還是會**的

論壇徽章:
0
5 [報告]
發(fā)表于 2015-06-28 15:44 |只看該作者
回復(fù) 4# tc1989tc
嗯勒,謝謝你!


   
KingaChou 該用戶已被刪除
6 [報告]
發(fā)表于 2015-09-02 09:09 來自手機 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP