阻止套接字并选择

时间:2011-02-23 13:20:21

标签: python linux sockets network-programming ipc

我正在玩套接字,我对使用带有select的阻塞套接字有一些疑问。我假设我只跟踪潜在的读者。我是否正确认为select将通过列表中的第一个套接字,如果有一些数据可用,它将返回,如果不是,它将阻塞直到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)

由于它们是阻塞套接字,因此在测试时会选择始终阻塞以查看列表中的套接字是否有要读取的数据?

2 个答案:

答案 0 :(得分:5)

select() C API返回当前可读的所有套接字的列表。假设python的包装器做同样的事情,如果多个套接字可读,sread将包含多个元素。

阻塞套接字只会在没有数据的情况下阻止,因此在select()调用表明有数据后,您可以假设一次调用recv不阻止。

答案 1 :(得分:2)

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

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