我试图确保每次调用socket.send函数时,我的缓冲区都被发送(刷新)到我的服务器(使用unix套接字在C语言中)。

根据我的理解(以及我在此板上看到的内容),只是禁用了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_NODELAY似乎没有任何作用...这是一个错误还是我遗漏了一些东西?

TIA

最佳答案

TCP不提供任何形式的保证“数据包”发送到另一端。您正在以最快的速度发送数据,TCP会帮助将数据批量处理成一次可以发送的最大数量。您的服务器一次接收4096个字节的数据,可能是因为它要求的(在recv()调用中)。

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

关于Python套接字刷新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4407835/

10-11 10:42