OS何时刷新插座?

时间:2015-04-19 16:49:36

标签: sockets

假设我有这个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,接收之间的时间间隔。所有这些字符都以相同的模式刷新,即一个接一个。在任何情况下缓冲区都没有填充。我的问题是:是什么原因导致服务器套接字冲洗缓冲区而不是溢出?现在又怎么会出现另一个字节呢?

字符串是以空字符结尾的字节模式。套接字流被终止了吗?

1 个答案:

答案 0 :(得分:1)

  

在收到i的值结束时将是2

没有。它可以是2到101之间的任何值。recv读取至少一个字节,最多读取远程端发送的字节数。它可以读取介于两者之间的任何数量。

  

所以地球上的袜子怎么知道收到10个字符后就没有更多的流来了

没有。它给你了什么。