- 论坛徽章:
- 0
|
小弟使用EPOLLIN来触发可读事件,按照网上说的,ET模式下,只有缓冲区从不可读变成可读才会触发EPOLLIN时间,可现在写了一个测试程序,客户端每次发多个字节,服务器每次只收一个字节,但每次都会触发EPOLLIN事件,如果只收一个字节,缓冲区还有数据,下次发送就应该不会再触发EPOLLIN事件(ET模式下),服务端代码如下:- #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;
- }
复制代码 客户端使用: nc 来连接,并发送数据,第一次发了abcd,触发了EPOLLIN,但服务器只收一个字节,第二次发了ef,依然触发了EPOLLIN。
服务器端的接收情况:
此外:如果我注册的时候是EPOLLET|EPOLLOUT ,为什么这个EPOLLOUT每次都会触发?
谢谢各位! |
|