Python中socket里的.recv()函数问题

Python012

Python中socket里的.recv()函数问题,第1张

可以通过setsockopt,或者更简单的setblocking,

settimeout设置。阻塞式的socket的recv服从这样的规则:

缓冲区内有数据时,立即返回所有的数据;当缓冲区内无数据时,阻塞直到缓冲区中有数据。非阻塞式的socket的recv服从的规则则是:

当缓冲区内有数据时,立即返回所有的数据;当缓冲区内无数据时,产生EAGAIN的错误并返回(在Python中会抛出一个异常)。两种情况都不会返回空字符串,返回空数据的结果是对方关闭了连接之后才会出现的。

原来Python的socket.recv(n)函数,并没有真正将我们希望接收的数据字长n全部接收,只需要保证Python将我们希望接收的所有长度接收即可。那么根据需求,我们自己实现一个接收的函数即可:

#------------------------------------------------------# RecvN# recv N bytes to target

#------------------------------------------------------def RecvN(socket, n):

totalContent = b''

totalRecved = 0

while totalRecved <n:

onceContent = socket.recv(n - totalRecved)print("onceContent", onceContent)totalContent += onceContent

totalRecved = len(totalContent)

return totalContent

# data = sockfd.recv(30 * 1024 + 14)

data = RecvN(sockfd, 30 * 1024 + 14)

这样的话,就可以把我们所有需要接收的字长接收了。