私はソケットで遊んでいます。select.Letでブロッキングソケットを使用することに疑念を抱いています。 selectがリストの最初のソケットを経由すると思っています。データがあればそれが返され、そうでなければselectのタイムアウトが切れるまでブロックされますか?読み取りリスト内の他のソケットはいつ選択されますか?ソケットをブロックして選択します
私は単純化のためのPythonの例で説明しましょう:リスト中のソケットが読むためのデータを持っているかどうかを確認するためにテストするとき、彼らはソケットをブロックしているので
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()'のプロパティが要求されたデータよりも少ないデータを返すことを意味していても、データが利用可能である場合には、一般的にブロックされません。 –