我玩插座,我对使用阻塞套接字select.Let的假设我只跟踪潜在的读者。我是否正确地认为select会通过列表中的第一个套接字,如果有一些数据可用,它将返回,如果没有,它会阻塞,直到select的超时过期为止?读取列表中的其他套接字何时将通过选择进行检查?阻止套接字和选择
让我说明与简单蟒蛇例如:
servsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
servsock.bind(("", 2500))
servsock.listen(15)
servsock.setblocking(1)
readlist = [servsock]
while 1:
(sread, swrite, sexc) = select.select(readlist, [], []);
for sock in sread:
#received a connect to the server socket
if sock == servsock:
(newsock, address) = servsock.accept()
newsock.setblocking(1)
print "I got a connection from ", address
readlist.append(newsock)
newsock.send("you're connected to the select server")
else:
recv_msg = sock.recv(5)
if recv_msg == "":
(host, port) = sock.getpeername()
print "Client %s:%s closed the connection" % (host,port)
sock.close()
readlist.remove(sock)
else:
(host, port) = sock.getpeername()
print "client %s:%s sent: %s "% (host,port,recv_msg)
因为他们封锁插座,将选择总是阻止测试,以查看是否在列表中的插座有数据读取的时候?
换句话说,select对阻塞和非阻塞套接字的作用方式相同? – theprole
是的,它只会告诉你数据是否可用,而不是读取是否会阻塞。如果数据可用,通常读不会阻塞,即使这意味着返回的数据少于请求的数据是'recv()'的属性。 –