2011-02-23 15 views
1

私はソケットで遊んでいます。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) 

、常にブロック]を選択しますか?

答えて

5

select() C APIは、現在読み取り可能なすべてのソケットのリストを返します。 Pythonのラッパーが同じであると仮定すると、sreadは、複数のソケットが読み取り可能な場合、複数の要素を含みます。 select()呼び出しはデータがある示された後、あなたはrecvからコールがブロックされないことを前提とすることができますので、何もデータが存在しない場合

ブロッキングソケットはブロックします。

+0

つまり、selectは、ブロッキングソケットとノンブロッキングソケットで同じように動作しますか? – theprole

+0

はい、読み取りがブロックされるかどうかではなく、データが利用可能かどうかだけを示します。 'recv()'のプロパティが要求されたデータよりも少ないデータを返すことを意味していても、データが利用可能である場合には、一般的にブロックされません。 –

2

select()は、いずれかのソケットにデータがあるまでブロックします。最初のものだけをチェックするのではなく、readlist変数のすべてをチェックします。

for sock in sread:では、読み取るデータを持つすべてのソケットを反復処理します。

関連する問題