免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9242 | 回复: 5
打印 上一主题 下一主题

[其他] 大家帮我看看,我发现libwebsocket有个问题,在和老外讨论 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-24 07:21 |只看该作者 |倒序浏览
大意是早期的libwebsockets socket是block的,现在它改为non-block了,内部机制是用poll来实现事件侦听。
用户程序维护一个回调处理各种事件,写数据是WIRTEABLE事件是依靠poll提供的POLLOUT机制来触发的。

我和他们的分歧在于,他们认为当用户得到writeable事件时,用户能保证写入N个数据,N是socket在连接建立后
设置的SO_SNDBUF, 我认为这个无法保证,有些情况下socket只真正发送了n个数据后(n<N),POLL因为socket有空闲写空间就触发POLLOUT了。
然后用户得到writeable事件,但是此时无法再写入N个数据。

鉴于英语非第一语言,所以有些不是太明白,或者表达不清,大家帮我看看。

http://libwebsockets.org/trac/libwebsockets/ticket/40

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2013-09-24 09:16 |只看该作者
帮顶。 这库只能用他的网络IO部分么,用自己的网络IO部分可以不? 只想用它websocket解析的代码。。

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
3 [报告]
发表于 2013-09-24 12:06 |只看该作者
回复 1# jetking


    有几个问题:
 1、Linux并不使用SO_SNDLOWAT,如果使用setsockopt进行设置会返回错误ENOPROTOOPT,而且使用select或poll时也不遵守SO_RCVLOWAT的规则。
 2、设置SO_SNDBUF时,内核实际上使用两倍的SO_SNDBUF空间,
 
 所以你的问题假设应该不存在。

论坛徽章:
0
4 [报告]
发表于 2013-09-24 12:26 |只看该作者
回复 3# myworkstation

如果内核double的话,就没有我说的这个问题了
   

论坛徽章:
0
5 [报告]
发表于 2013-09-24 12:43 |只看该作者
回复 3# myworkstation

1,2都对。

但我觉得内核double buffer还是会出现上述情况

比如设了4K,double 到8K,用户每次write 4K。
第1次write ok,但是由于网络原因或者接收窗口,实际只发送了1k后就POLLOUT了,buffer里还有4+1=5K,然后用户再write 4K也没问题,等到又发送了1K ,又pollout了,这时有2K left,用户此时真正只能写入2K了。

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
6 [报告]
发表于 2013-09-24 14:34 |只看该作者
回复 5# jetking


    double缓冲会处理这个问题的,这个缓冲分两部分来看,你真实用到的最大值只能是其一半,而你说的有未发送数据时产生POLLOUT只能在系统使用的另一半有数据时可能触发,无论何时必须在至少有一半缓冲可用时才能触发POLLOUT
这与手册上的说法是相吻合的The kernel doubles this value (to allow space for bookkeeping overhead)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP