如果没有读取,python套接字可以接收填充吗?

时间:2017-08-21 07:46:51

标签: python sockets tcp

如果您没有从python tcp套接字读取,它是否会填充并导致错误? 在我的代码中,我使用.send(),似乎有一个来自我正在交谈的设备的回复。如果我不读这些,他们会积累并产生问题吗?它只是无限地存储它们吗?当然这最终会引起记忆问题...... 感谢。

1 个答案:

答案 0 :(得分:1)

如果你没有从tcp套接字读取,那么接收端的recv缓冲区和seinding端的发送缓冲区将会填满,此时你的程序将阻止进一步send()次调用。 / p>

每个进程将使用多少内存取决于这些缓冲区的大小,这取决于操作系统和套接字选项。例如,在linux上你会遇到这样的情况:

$ ss -tpn
State  Recv-Q Send-Q  Local Address:Port Peer Address:Port   
ESTAB  0      2595384 127.0.0.1:3333     127.0.0.1:2222    users:(("python3",pid=13088,fd=3))
ESTAB  964588 0       127.0.0.1:2222     127.0.0.1:3333    users:(("python3",pid=13087,fd=4))

第一行显示发送过程(完整发送队列,~2.6MB),第二行显示接收过程(完整recv队列,~1MB)。

这是因为在使用TCP的data transfer期间,接收方通过每个ACK告诉发送方它准备接受下一次传输的数据量。如果rec缓冲区已满,则发送缓冲区也将填满,然后不再发送数据。