如何检测到客户端已关闭内核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;
}
}