免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: enchanter1982
打印 上一主题 下一主题

问诸位Python高手,一个Socket编程的问题,在线等待 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-02-21 08:19 |只看该作者
原帖由 alexhappy 于 2009-2-20 21:15 发表

???send不是只把数据拷到发送缓冲区里了没?第一个send有可能跟第二个send一起发送了不是吗?

send应该是数据copy到socket的发送缓冲区里。

[ 本帖最后由 luffy.deng 于 2009-2-21 08:22 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2009-02-21 09:25 |只看该作者
用makefile(),改用write发数据然后flush()不知道能不能达到lz的目的。

[ 本帖最后由 luffy.deng 于 2009-2-21 11:21 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2009-02-21 11:24 |只看该作者
原帖由 alexhappy 于 2009-2-20 21:15 发表

???send不是只把数据拷到发送缓冲区里了没?第一个send有可能跟第二个send一起发送了不是吗?


应该是的,send只是copy数据到tcp的发送缓冲区,如果网络忙,消息很短,很可能第一个send和第二个send是被TCP协议一起送出去。

另外:TCP协议是基于流的,根本不关心流的内容,至少有三个方案来解决lz问题

1. 断流:
     发送一个消息后,close socket,只有close socket 时 tcp 才会清缓冲区。

2. 自己定义一下消息的结束符号。server端直接根据结束符号处理消息,支持一次处理多条消息。
    如果消息是文本好说,定义一下回车就可以,或者自己再随便选一个;
    如果是二进制则client encoding一下, server decoding 一下,编码方式也有很多可以google一下

3. 使用socket.fineno(),返回fd ,然后再调用flush 看看, 不过python 的 library ref上说windows不支持,此法我没试过!!
    猜想flush使用的是操作系统IO的同步功能,应该与TCP内部实现无关。

论坛徽章:
0
14 [报告]
发表于 2009-02-23 10:36 |只看该作者
原帖由 yunccll 于 2009-2-21 11:24 发表


应该是的,send只是copy数据到tcp的发送缓冲区,如果网络忙,消息很短,很可能第一个send和第二个send是被TCP协议一起送出去。

另外:TCP协议是基于流的,根本不关心流的内容,至少有三个方案来解决lz问 ...


第一方案,第二方案不能接受

第三个方案试了,无效,还是Send的几个消息 ,变成一个TCP消息发出去

论坛徽章:
0
15 [报告]
发表于 2009-02-23 11:46 |只看该作者
原帖由 enchanter1982 于 2009-2-23 10:36 发表


第一方案,第二方案不能接受

第三个方案试了,无效,还是Send的几个消息 ,变成一个TCP消息发出去

那你就把发送缓冲区改成只能发送一个TCP消息包或者不超过能发送两个包的大小不就完了

论坛徽章:
0
16 [报告]
发表于 2009-02-23 13:24 |只看该作者
原帖由 alexhappy 于 2009-2-23 11:46 发表

那你就把发送缓冲区改成只能发送一个TCP消息包或者不超过能发送两个包的大小不就完了

我的消息包是变长的,难道每次发送时都改发送缓冲区?

论坛徽章:
0
17 [报告]
发表于 2009-02-24 12:35 |只看该作者
试试这个:
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)

refer to:
http://hi.baidu.com/smartroses/b ... d9d034e8248847.html

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
18 [报告]
发表于 2009-02-24 19:27 |只看该作者
send成功只代表数据进入发送缓存区,client send次数和tcp包数没有直接关系,由tcp层(内核)的流量控制和拥塞控制处理,同时server也有缓存,所以试图改变tcp包数是没有任何意义的。即使消息不定长,也肯定有区别消息边界的方法,如HTTP,因此修改server的收包方式才是解决之道。

论坛徽章:
0
19 [报告]
发表于 2009-02-25 15:54 |只看该作者
TCP是流模式的,也就是说,它只管给你发送数据,至于发送的数据怎么解释依赖于你应用层的协议如何定义.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP