Skip to content

Commit

Permalink
TCP server with "selectors"
Browse files Browse the repository at this point in the history
  • Loading branch information
davidvilla committed Mar 19, 2024
1 parent 14b12bd commit fcda0bc
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 9 deletions.
18 changes: 9 additions & 9 deletions TCP_select.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,18 @@ def upper(msg):
return msg.upper()


def ChildHandler(s):
data = s.recv(32)
def child_handler(sock):
data = sock.recv(32)
if not data:
socks.remove(s)
s.close()
socks.remove(sock)
sock.close()
return

s.sendall(upper(data))
sock.sendall(upper(data))


def ParentHandler(s):
child_sock, client = s.accept()
def master_handler(sock):
child_sock, client = sock.accept()
socks.append(child_sock)
print("+ Client connected: {}, Total {} sockets".format(
client, len(socks)))
Expand Down Expand Up @@ -58,8 +58,8 @@ def socket_peer(sock):

for i in read_ready:
if i == ss:
ParentHandler(i)
master_handler(i)
else:
ChildHandler(i)
child_handler(i)

show_status(socks, read_ready)
46 changes: 46 additions & 0 deletions TCP_selectors.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#!/usr/bin/python3
# Copyright: See AUTHORS and COPYING
"Usage: {0} <port>"

import sys
import socket
import selectors
import time


def upper(msg):
time.sleep(1) # simulates a complex job
return msg.upper()


def child_handler(sock):
data = sock.recv(32)
if not data:
selector.unregister(sock)
sock.close()
return

sock.sendall(upper(data))


def master_handler(sock):
conn, client = sock.accept()
selector.register(conn, selectors.EVENT_READ, child_handler)
print("+ Client connected: {}".format(client))


if len(sys.argv) != 2:
print(__doc__.format(sys.argv[0]))
sys.exit(1)

ss = socket.socket()
ss.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
ss.bind(('', int(sys.argv[1])))
ss.listen(30)

selector = selectors.DefaultSelector()
selector.register(ss, selectors.EVENT_READ, master_handler)

while True:
for key, mask in selector.select():
key.data(key.fileobj)

0 comments on commit fcda0bc

Please sign in to comment.