- 論壇徽章:
- 0
|
小弟使用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ù)端代碼如下:- #include <iostream>
- #include <cstring>
- #include <sys/epoll.h>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <netinet/in.h>
- #include <errno.h>
- #include <fcntl.h>
- int main(void)
- {
- int serfd = socket(AF_INET, SOCK_STREAM, 0);
- int clifd;
- int ret;
- if(serfd < 0)
- std::cout << "Create serfd fail!\n";
- struct sockaddr_in cliaddr, seraddr;
- bzero(&seraddr, sizeof(seraddr));
- seraddr.sin_family = AF_INET;
- seraddr.sin_port = htons(12439);
- seraddr.sin_addr.s_addr = inet_addr("0.0.0.0");
- int on = 1;
- setsockopt(serfd, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof(on));
- bind(serfd, (struct sockaddr*)&seraddr, sizeof(seraddr));
- listen(serfd, 20);
- socklen_t len = sizeof(cliaddr);
- bzero(&cliaddr, sizeof(seraddr));
- clifd = accept(serfd, (struct sockaddr*)&cliaddr, &len);
- if(clifd < -1){
- std::cout << strerror(errno) << std::endl;
- close(serfd);
- return 0;
- }
- fcntl(clifd, F_SETFL, O_NONBLOCK);
- //Create epoll
- int epfd = epoll_create(1024);
- struct epoll_event ev;
- struct epoll_event events[1024];
- ev.events = EPOLLET | EPOLLIN ;
- ev.data.fd = clifd;
- epoll_ctl(epfd, EPOLL_CTL_ADD, clifd, &ev);
- while(1)
- {
- int num = epoll_wait(epfd, events, 1024, -1);
- char buf[1024] = {0};
- for(int i = 0; i < num; i++)
- {
- if(events[i].events & EPOLLIN){
- std::cout << "Ready to read!\n";
- std::cout << "size=" << read(events[i].data.fd, buf, 1)
- << "\tbuf=[" << buf << ']' << std::endl;
- }
- if(events[i].events & EPOLLOUT){
- std::cout << "Ready to write!\n";
- }
- }
- }
- return 0;
- }
復(fù)制代碼 客戶端使用: nc 來連接,并發(fā)送數(shù)據(jù),第一次發(fā)了abcd,觸發(fā)了EPOLLIN,但服務(wù)器只收一個字節(jié),第二次發(fā)了ef,依然觸發(fā)了EPOLLIN。
服務(wù)器端的接收情況:
此外:如果我注冊的時候是EPOLLET|EPOLLOUT ,為什么這個EPOLLOUT每次都會觸發(fā)?
謝謝各位! |
|