假设我有这个Python代码:
read=true;
i=0;
while (read){
data =sock.recv(100);
i+=1;
print data;
}
现在另一端我用101个字符给插座供电。在接收结束时,i
的值将为2,因为所有的feed都不会以100个字符的缓冲区结束 - 剩下的一个char将转到另一个迭代。这是可以理解的:缓冲区填充,信息刷新到变量data
。
但是,如果我只给10个字符的插座供电,会发生什么?缓冲区没有填满,所以地球上的sock
怎么知道收到10个字符后就没有更多的流来了,是时候刷新缓冲区并将消息返回'数据'了?
实际的复制粘贴示例:
SERVER:
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.bind("/tmp/somesfile")
s.accept(1)
s.listen()
conn, addr = s.accept()
i=0
read=True
while read:
conn.recv(10)
i = i + 1
print i
客户端:
c = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
c.connect("/tmp/somesfile")
发送数据(CLIENT上的控制台)
>>> c.send("aaaaa")
5
>>> c.send("a")
1
>>> c.send("a")
1
>>> c.send("a")
1
>>> c.send("a")
1
>>>
接收数据(SERVER上的控制台)
'aaaaa'
1
'a'
2
'a'
3
'a'
4
'a'
5
服务器具有为接收数据准备的10字节缓冲区。在第一次突发时,它接收到5个字符 - 所有5个存储在同一个缓冲区中并刷新。在进一步的4个突发中,服务器一个接一个地发送4个shars,接收之间的时间间隔。所有这些字符都以相同的模式刷新,即一个接一个。在任何情况下缓冲区都没有填充。我的问题是:是什么原因导致服务器套接字冲洗缓冲区而不是溢出?现在又怎么会出现另一个字节呢?
字符串是以空字符结尾的字节模式。套接字流被终止了吗?
答案 0 :(得分:1)
在收到i的值结束时将是2
没有。它可以是2到101之间的任何值。recv
读取至少一个字节,最多读取远程端发送的字节数。它可以读取介于两者之间的任何数量。
所以地球上的袜子怎么知道收到10个字符后就没有更多的流来了
没有。它给你了什么。