我试图确保每次调用 socket.send 函数时,我的缓冲区都会发送(刷新)到我的服务器(使用 unix 套接字在 C 中)。
根据我的理解(以及我在这个板上看到的内容),只需禁用 naggle 算法。应该这样做,但我的服务器仍然收到 4096 字节 block 的数据(默认设置)...
我在 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/