【发布时间】:2016-09-26 11:54:53
【问题描述】:
我正在 UDP 之上实现自定义传输层协议,以提供强大的交付服务,并且需要确保正确的内存管理。我正在尝试使用 TCP 作为参考,看看函数 tcp_sendmsg() 如何处理内存限制。
在tcp_sendmsg()的内核代码中,
if (!sk_stream_memory_free(sk))
goto wait_for_sndbuf;
wait_for_sndbuf:
set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
因此为套接字设置了 SOCK_NOSPACE 标志。但是稍后如何以及在何处清除该位?而tcp_sendmsg()函数又是如何知道该位已被清零并可以继续发送数据的呢?
编辑 1:正如 Maxim 在他的回答中所建议的,函数 sk_stream_wait_memory() 处理等待 TCP。我建立在 UDP 之上的协议也可以使用这个“流”功能吗?
【问题讨论】:
标签: tcp linux-kernel network-programming