Python套接字:使用send()和recv()时有关网络缓冲区的问题

2024-04-25 07:24:31 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,当然,我已经阅读了相当多的时间,包括这个站点上的许多线程,但是我仍然需要一些关于套接字、TCP和Python网络的澄清,因为我觉得我不完全理解我的程序中发生了什么。你知道吗


我使用TCP(SOCK\ u流)通过Unix域套接字(AF\ Unix)将数据从服务器发送到客户机。你知道吗

在服务器端,一个进程不断地将项目放到排队。排队另一个进程是通过运行

while True:
    conn.sendall(queue.get())

在客户端,通过运行

while True:
    conn.recv(1024)
    # time.sleep(10)

现在,我通过在每次调用recv()之后将客户端进程发送到sleep来模拟慢速客户端。我所期望的是服务器端的队列已经满了,因为send()应该被阻塞,因为客户端读取数据的速度不够快。你知道吗

我监视发送到客户机的项目数以及队列大小。我注意到有几十条消息(大致取决于消息的大小,但稍有不同的消息大小可能表现相同)被发送到客户机(由于以下原因,客户机会延迟接收这些消息)时间.渗漏())在队列开始填满之前。你知道吗


这里发生了什么?为什么send()没有立即阻塞?你知道吗

我怀疑涉及到某种网络或文件缓冲区,它将发送项目排队,并在我实现的队列之前填满。你知道吗


Tags: 项目网络true消息客户端客户机队列进程
1条回答
网友
1楼 · 发布于 2024-04-25 07:24:31

在系统的各个地方,发送方和接收方都有许多缓冲区。对发送函数的调用在所有缓冲区被填满之前不会被阻塞。当接收器耗尽一些缓冲区时,数据将再次流动,并最终解除发送呼叫的阻塞。你知道吗

通常,发送方中有一个缓冲区,保存着等待传输的数据,一个缓冲区“在飞行中”,允许在等待接收方确认之前发送一定数量的字节,最后接收缓冲区,保存着已经确认但尚未发送到接收应用程序的数据。你知道吗

如果不是这样,向前的进展将极为有限。发送方将一直等待发送,直到接收方调用receive。那么,谁先完成谁就得等另一个。即使发送方先完成,在接收方完成前一个数据块的处理之前,它也无法进行任何转发。这对于大多数应用程序来说都是次优的。你知道吗

相关问题 更多 >