Как обнаружить, что клиент закрыл сокет в tcp-сервере ядра?Чтобы обработать часть чтения, я жду с wait_queue на sock->sk->sk_receive_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;
}
}