非阻塞socket与epoll的ET模式结合使用注意事项
来源:互联网 发布:淘宝店如何发布宝贝 编辑:程序博客网 时间:2024/06/05 10:06
当非阻塞socket与epoll的ET模式结合使用进行编程时需要注意的事项:
当客户端与服务端建立连接数据通信完成后,即服务端收到客户端的数据后,再向客户端发送数据,当发送完数据后立马断开连接。客户端epoll_wait和read的处理:
while(1)
{
nfds = epoll_wait(epfd_rcv, events, EVENTSIZE , -1);// get the sockfd ready
if (nfds < 0){
if(errno == EINTR)
continue;
else{
fprintf(stderr, "epoll_wait err:%s\n", strerror(errno));
return NULL;
}
}
for (i=0; i < nfds; i++){
if(events[i].events & EPOLLIN){
if ( (sockfd = events[i].data.fd) < 0) {
continue;
}
num2=1;
while(num2>0)
{
num2 = read(sockfd, recv_buf, g_receive_package_size - data_buf_r[sockfd]);
if (num2 < 0) { //有对errno的处理
if ( (errno != EINTR) && (errno != EAGAIN) ) {
if (close(sockfd) == 0) {
...........
}
}
} else if (num2 == 0) { //无对errno的处理,当num2=0 时系统没有给errno赋新值,而errno是全局变量会保存上一次系统赋给它的值
if (close(sockfd) == 0) {
.............
}
}else{
.............
............
}
}
}
}
当客户端与服务端建立连接数据通信完成后,即服务端收到客户端的数据后,再向客户端发送数据,当发送完数据后立马断开连接。客户端epoll_wait和read的处理:
while(1)
{
nfds = epoll_wait(epfd_rcv, events, EVENTSIZE , -1);// get the sockfd ready
if (nfds < 0){
if(errno == EINTR)
continue;
else{
fprintf(stderr, "epoll_wait err:%s\n", strerror(errno));
return NULL;
}
}
for (i=0; i < nfds; i++){
if(events[i].events & EPOLLIN){
if ( (sockfd = events[i].data.fd) < 0) {
continue;
}
num2=1;
while(num2>0)
{
num2 = read(sockfd, recv_buf, g_receive_package_size - data_buf_r[sockfd]);
if (num2 < 0) { //有对errno的处理
if ( (errno != EINTR) && (errno != EAGAIN) ) {
if (close(sockfd) == 0) {
...........
}
}
} else if (num2 == 0) { //无对errno的处理,当num2=0 时系统没有给errno赋新值,而errno是全局变量会保存上一次系统赋给它的值
if (close(sockfd) == 0) {
.............
}
}else{
.............
............
}
}
}
}
因为是非阻塞socket和ET模式,如果不进行循环read的话,服务器发送完数据后立即close掉连接,那么客户端能read到服务器发送来的数据但是捕捉不到服务器close连接的事件,而客户端的tcp/ip协议栈收到了服务器发来的FIN包,但由于应用程序中没有捕获到服务器close连接的事件,也就是没有read返回0,因此没有向服务器发送FIN包,导致客户端大量的CLOSE_WAIT.
http://blog.163.com/wangdong8213@126/blog/static/45852366201282633349139/
- 非阻塞socket与epoll的ET模式结合使用注意事项
- 非阻塞socket与epoll的ET模式结合使用注意事项
- epoll ET模式 注意事项
- 非阻塞socket与epoll
- 非阻塞,et模型 epoll
- socket的阻塞与非阻塞模式
- Epoll-ET模式下非阻塞读写之Buffer的封装
- epoll下ET模式为何一定要用要用非阻塞的模式~
- EPOLL使用ET模式的异常现象
- 彻底学会使用epoll(五)—— ET模式下的注意事项
- 彻底学会使用epoll(五)—— ET模式下的注意事项
- 彻底学会使用epoll(五)—— ET模式下的注意事项
- 彻底学会使用epoll(五)—— ET模式下的注意事项
- I/O阻塞非阻塞与异步 epoll总结 ET/LT AStar提速
- epoll在ET模式下的一些注意事项
- Socket 阻塞与非阻塞模式
- socket阻塞与非阻塞模式区别
- Socket 阻塞与非阻塞模式
- 怎样关闭ping命令
- 反馈、无反馈、不和谐的反馈
- glPushMatrix();glPopMatrix()
- 艾宾浩斯记忆曲线背单词
- Js中 关于top、clientTop、scrollTop、offsetTop的用法
- 非阻塞socket与epoll的ET模式结合使用注意事项
- Fred George访谈录:关于敏捷开发的精彩见解
- 串口应用程序
- JAVA缓存技术
- 查看本机服务 端口
- BIT1061Ubiquitous Religions
- ubuntu终端使用方式(快捷键)
- 设置搜狗输入法时间函数,不显示年月日。
- Fred George谈程序员的无政府主义