奇怪的 socket 问题,收发次数有限
写了一个模块,主要利用几个 kernel socket api,搭建了一个简单的 client 连接 nginx。
逻辑超级简单,也就是在一个无限循环里,不停地接收发送。sock_create();
kernel_connect();
while (1) {
kernel_sendmsg();
kernel_recvmsg();
}于是出现了奇怪的问题,无论我如何尝试,都只能循环 100 次,第 101 次必然失败(为啥人家第 101 次求婚就成功了)。
我将 sk->sk_rmem_alloc 这个值打印出来,发现前 100 次都是一个固定的值,下一次就直接变为 0 了。试着跟踪了一下相关代码,最后昏迷。:em06:
不知道哪位大能出手提点一下?谢谢。
给你查了一下,应该是因为发太快了,缓冲区满了。
可以参考一下下面的文章:
http://blog.chinaunix.net/uid-23146151-id-3125031.html 回复 2# Tinnal
谢谢。我的困惑就在这里。
我的 socket 是阻塞型的,每次都保证全部 recv 之后,才进行的下一轮 send。在这种情况下,缓冲区怎么还会被填满呢?
难道我每次 recv 之后,缓冲区没有相应的清除操作?这个不太可能吧。 真阻塞了吗,还是返回错误吗你没有留意? 你可以找些打印,确定一下原因。
原则来说,sk_buf释放这个数就会减下来。 回复 4# Tinnal
每次 recv 的内容我都打印出来,确实完整接收。
不过在第 101 次的时候,send 成功,recv 直接失败。sk_rmem_alloc 的值变为 0,所以比较困惑。
明天把缓冲区加大再试试。不知道有没有接口可以手动清空的。
回复 4# Tinnal
找到原因了,是nginx在捣鬼。{:3_188:} 回复 6# wait_rabbit
详细分享一下呗
回复 6# wait_rabbit
对呀,分享一下。 回复 8# Tinnal
看起来是 nginx 主动把 socket 给我关了。我另外用模块写了一个 server,就一切正常。
页:
[1]