2011-02-23 60 views
1

我玩插座,我对使用阻塞套接字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) 

因为他们封锁插座,将选择总是阻止测试,以查看是否在列表中的插座有数据读取的时候?

回答

5

select() C API返回当前可读的所有套接字的列表。假设python的包装器是相同的,如果多个套接字可读,sread将包含多个元素。如果没有数据存在,所以后select()来电显示有数据,你可以假设一个调用recv不会阻止

阻塞套接字只会阻塞。

+0

换句话说,select对阻塞和非阻塞套接字的作用方式相同? – theprole

+0

是的,它只会告诉你数据是否可用,而不是读取是否会阻塞。如果数据可用,通常读不会阻塞,即使这意味着返回的数据少于请求的数据是'recv()'的属性。 –

2

select()将阻塞,直到其中一个套接字有数据。它不检查第一个,它检查readlist变量中的所有内容。

for sock in sread:它遍历所有有数据要读取的套接字。