我试图确保每次调用socket.send函数时,缓冲区都被发送(刷新)到服务器(在C中使用unix socket)。
根据我的理解(以及我在这张黑板上看到的),只是禁用了naggle算法。应该这样做,但我的服务器仍然接收4096字节块(默认设置)的数据。。。
我在Python v2.5.4中使用以下代码:
self.sck = socket( AF_INET, SOCK_STREAM )
self.sck.setsockopt( IPPROTO_TCP, TCP_NODELAY, 1 ) # That doesn't seems to work...
self.sck.connect( ( "127.0.0.1", "12345" ) )
while( 1 ):
self.sck.send( "test\n" )
self.sck.send( "" ) # Still trying to flush...
启用/禁用TCP节点似乎没有任何效果。。。这是虫子还是我遗漏了什么?
短暂性脑缺血发作
TCP不提供任何类型的保证“包”发送到另一端。您正在以尽可能快的速度发送数据,而TCP正在尽可能多地将数据成批地发送。您的服务器一次接收4096字节的数据,可能是因为它要求这样做(在
recv()
调用中)。TCP是一种流协议,因此您必须实现某种框架。没有内置的消息边界。
我工作的唯一方法(回到C客户机)是使用:
最大的优点是我的writer_obj默认为文本模式,因此不再进行字节转换。
创建一个reader对象并没有那么顺利,但我不需要在这一边刷新。
无法确保发送的数据块的大小。如果要确保要发送的所有数据都已发送,可以关闭连接:
还要注意,n=socket.send()返回实际发送的字节数。如果您确定要发送所有数据,则应使用
或循环发送数据:
(但这与sendall()大致相同)。 如果您想以更大的块接收数据,可以在recv()中增加缓冲区的大小,但这只会使可能的块大小变大。无法保证数据达到这些大小。
相关问题 更多 >
编程相关推荐