wait_rabbit 发表于 2014-08-12 19:40

奇怪的 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:

不知道哪位大能出手提点一下?谢谢。

Tinnal 发表于 2014-08-12 21:53

给你查了一下,应该是因为发太快了,缓冲区满了。
可以参考一下下面的文章:
http://blog.chinaunix.net/uid-23146151-id-3125031.html

wait_rabbit 发表于 2014-08-12 22:13

回复 2# Tinnal


谢谢。我的困惑就在这里。

我的 socket 是阻塞型的,每次都保证全部 recv 之后,才进行的下一轮 send。在这种情况下,缓冲区怎么还会被填满呢?

难道我每次 recv 之后,缓冲区没有相应的清除操作?这个不太可能吧。

Tinnal 发表于 2014-08-12 22:26

真阻塞了吗,还是返回错误吗你没有留意? 你可以找些打印,确定一下原因。
原则来说,sk_buf释放这个数就会减下来。

wait_rabbit 发表于 2014-08-12 22:42

回复 4# Tinnal

   
每次 recv 的内容我都打印出来,确实完整接收。

不过在第 101 次的时候,send 成功,recv 直接失败。sk_rmem_alloc 的值变为 0,所以比较困惑。

明天把缓冲区加大再试试。不知道有没有接口可以手动清空的。

wait_rabbit 发表于 2014-08-13 11:20

回复 4# Tinnal


找到原因了,是nginx在捣鬼。{:3_188:}

wLiu2007 发表于 2014-08-13 12:38

回复 6# wait_rabbit
详细分享一下呗

   

Tinnal 发表于 2014-08-13 20:41

回复 6# wait_rabbit


对呀,分享一下。

wait_rabbit 发表于 2014-08-14 01:29

回复 8# Tinnal


看起来是 nginx 主动把 socket 给我关了。我另外用模块写了一个 server,就一切正常。
页: [1]
查看完整版本: 奇怪的 socket 问题,收发次数有限