您的当前位置:首页关于 socket.recv 阻塞问题

关于 socket.recv 阻塞问题

2024-09-01 来源:乌哈旅游

在开发中遇到个问题。

 

标准的socket 客户端应该是这样的~_~ 我见网上书上都这样写。所以我说是“标准的”

 

 

客户端在 recv 服务端发送来的数据后,就直接 close socket 了。这样的确是没问题

但我在想,如果服务端一次发送的数据量很大很大~~  超出了  recv(指定的bufsize) 那么一次接收不是有问题了吗?所以我改成了循环接收方式

 

 

 

的确。一样能接收,但这样的问题是。 recv 是阻塞的。也就是会一直等待服务端发送来的数据包。如果没有数据包到来,就一直会等待。

也就是后面的 if not len(a):break  无效,也就退不出循环。这个也是不符合我的需求的。 第一想到如何能让 recv 不阻塞了。通过查看手册发现两个办法

1 。    socket.setblocking(0)

2.       使用 socket.MSG_DONTWAIT   这个我们可以通过  man recv 来查看说明

 

但这样以后,还是有问题~,问题就是,recv不阻塞了。在 send 数据出去后,服务端还来没来得急返回数据,客户端已经跑到了recv这里,而又不阻塞。所以抛出了一个异常。这个在手册上有说明

 

Set blocking or non-blocking mode of the socket: if flag is 0, the socket is set to non-blocking, else to blocking mode. Initially all sockets are in blocking mode. In non-blocking mode, if a call doesn’t find any data, or if a call can’t immediately dispose of the data, a exception is raised;

 

可以在recv前加一个time.sleep(2)模拟一个阻塞就可以看到这个事实。加了 sleep 以后,recv就可以等到服务端返回的数据,顺利的在不阻塞的状态下执行下去了。

 

 

因篇幅问题不能全部显示,请点此查看更多更全内容