非阻塞socket与epoll的ET模式结合使用注意事项

本文探讨了非阻塞socket结合epoll的ET模式在编程中的注意事项,特别是在客户端如何正确处理read操作以避免出现大量CLOSE_WAIT状态的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当非阻塞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{
                            .............
                            ............
                     }
                }
       }
}

因为是非阻塞socket和ET模式,如果不进行循环read的话,服务器发送完数据后立即close掉连接,那么客户端能read到服务器发送来的数据但是捕捉不到服务器close连接的事件,而客户端的tcp/ip协议栈收到了服务器发来的FIN包,但由于应用程序中没有捕获到服务器close连接的事件,也就是没有read返回0,因此没有向服务器发送FIN包,导致客户端大量的CLOSE_WAIT.


http://blog.163.com/wangdong8213@126/blog/static/45852366201282633349139/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值