检测内核模块中的封闭套接字

时间:2019-05-24 17:11:18

标签: c tcp linux-kernel kernel

如何检测到客户端已关闭内核tcp服务器中的套接字? 为了处理阅读部分,我在sock-> sk-> sk_receive_queue上使用wait_queue等待。如果receive_queue中有一个skb,则调用kernel_recv。

显然,内核服务器中未检测到客户端的close(sock),并且它不断在队列中等待。没有调用kernel_recvmsg();否则它将返回0,服务器将释放套接字。

有什么想法如何在内核空间中处理这种情况? 在用户空间中很容易,因为close(socket)会唤醒select()。

处理连接的线程的主循环

    while(1)
   {
     add_wait_queue(&accept_socket->sk->sk_wq->wait, &recv_wait);  
     while(skb_queue_empty(&accept_socket->sk->sk_receive_queue))
    {
                  __set_current_state(TASK_INTERRUPTIBLE);
                  schedule_timeout(HZ);

                  if(kthread_should_stop())
                  {
                   LOG_INFO("thread stopped");


                          __set_current_state(TASK_RUNNING);
                          remove_wait_queue(&accept_socket->sk->sk_wq->wait,\
                                          &recv_wait);

                          goto out;
                  }

                  if(signal_pending(current))
                  {
                          __set_current_state(TASK_RUNNING);
                          remove_wait_queue(&accept_socket->sk->sk_wq->wait,\
                                          &recv_wait);
                          goto out;
                  }
          }
          __set_current_state(TASK_RUNNING);
          remove_wait_queue(&accept_socket->sk->sk_wq->wait, &recv_wait);

          memset(in_buf, 0, len+1);
          ret = read_from_tcp(accept_socket, flowPtr, p_id, address, in_buf, len,\
                                   MSG_DONTWAIT);
          if(ret > 0)
          {
            LOG_INFO("Forwarding packet...\n");

            if(memcmp(in_buf, "ADIOS", 5) == 0)
              break;
          }
   }

0 个答案:

没有答案