Python套接字刷新

2024-03-29 12:37:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图确保每次调用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节点似乎没有任何效果。。。这是虫子还是我遗漏了什么?

短暂性脑缺血发作


Tags: to数据函数self服务器算法send字节
3条回答

TCP不提供任何类型的保证“包”发送到另一端。您正在以尽可能快的速度发送数据,而TCP正在尽可能多地将数据成批地发送。您的服务器一次接收4096字节的数据,可能是因为它要求这样做(在recv()调用中)。

TCP是一种流协议,因此您必须实现某种框架。没有内置的消息边界。

我工作的唯一方法(回到C客户机)是使用:

my_writer_obj = mysock.makefile(mode='w', ...)
my_writer_obj.write('my stuff')
my_writer_obj.flush()

最大的优点是我的writer_obj默认为文本模式,因此不再进行字节转换。

创建一个reader对象并没有那么顺利,但我不需要在这一边刷新。

无法确保发送的数据块的大小。如果要确保要发送的所有数据都已发送,可以关闭连接:

self.sck.close()

还要注意,n=socket.send()返回实际发送的字节数。如果您确定要发送所有数据,则应使用

self.sck.sendall()

或循环发送数据:

while data:
    n = self.sck.send(data)    
    data = data[n:]

(但这与sendall()大致相同)。 如果您想以更大的块接收数据,可以在recv()中增加缓冲区的大小,但这只会使可能的块大小变大。无法保证数据达到这些大小。

相关问题 更多 >