Lexicon
Lexicon

Reputation: 2627

multiple network sockets python

I'm creating a python script that listens on several ports (defined in the portslist) and when someone connects to any of these ports, a "hello" message will be sent to them. Currently, the code below creates sockets for all ports in the portlist but only sends message to communication on last port.

Thanks

servers = []
for port in portlist:
    datasocket = ("0.0.0.0", port)

    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind(datasocket)
    server.listen(5)

    servers.append(server)


while True:
ready_server = select.select(servers, [], [])


for s in ready_server:
        connection, address = server.accept()
        print str(address) + " has connected!\n"
        msg ="hello\n"
        connection.send(msg)
        connection.close()

Upvotes: 0

Views: 376

Answers (1)

mata
mata

Reputation: 69012

When select.select returns, ready_server will be a list of lists like this:

[[<sockets ready to read from>], [], []]

So for s in ready_server will iterate over these lists, not over the sockets.

Also, server.accept() within that loop doesn't refer to any loop variable, but to the server from the previous loop.

Try this:

servers = []
for port in portlist:
    datasocket = ("0.0.0.0", port)

    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind(datasocket)
    server.listen(5)

    servers.append(server)


while True:
    # unpack the returned list
    ready_server, _, _ = select.select(servers, [], [])


    for s in ready_server:
        # use s.accept instead of server.accept
        connection, address = s.accept()
        print str(address) + " has connected!\n"
        msg ="hello\n"
        connection.send(msg)
        connection.close()

Upvotes: 1

Related Questions