我试图确保每次调用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/