1:我采用epoll的EPOLLET模式同时监听fd读写,客户端连接服务器之后只发送数据,按正常情况应该只会触发服务器端的EPOLLIN,但是实际情况却随机触发服务器端的EPOLLOUT。
2:我目前测试如果将recv函数的recv_buf大小设置小点(我设置的为4),就不会出现这个问题。而且即使按照我下面代码的1024大小,我要是一条一条发送也不会出现问题。
3:服务端代码如下:
while(1) {
nfds = epoll_wait(epollfd,events,1024,0);
sleep(1);
for(i = 0;i < nfds;i++) {
if(events[i].data.fd == listen_fd) { //连接请求
conn_fd = accept(listen_fd,(struct sockaddr *)&conn_addr,&conn_len);
printf("accept a new collection : %s\n",inet_ntoa(conn_addr.sin_addr));
ev.data.fd = conn_fd;
ev.events = EPOLLOUT | EPOLLIN | EPOLLET;
epoll_ctl(epollfd,EPOLL_CTL_ADD,conn_fd,&ev);
}
else if(events[i].events & EPOLLIN) { //读事件
if((sock_fd = events[i].data.fd) < 0 ) {
continue;
}
bzero(recv_buf,1024);
if((i = recv(sock_fd,recv_buf,1024,0) )== 0) { //这个recv的大小会影响结果
close(sock_fd);
events[i].data.fd = -1;
} else {
printf("%s\n",recv_buf);
}
}
else if(events[i].events & EPOLLOUT) { //写事件
bzero(recv_buf,1024);
strcpy(recv_buf,"我是服务器,收到了你的消息");
send(events[i].data.fd,recv_buf,1024,0);
}
}
4:客户端用nc 127.0.0.1 8888连接,结果会出现
5:
(备注:上面的汉字是服务器返回的,但是我客户端只是发送yang数据啊,为什么会触发服务端的写事件呢?)