Last active
February 3, 2020 12:14
-
-
Save mmkhitaryan/79d3dcf660885e4d15b7923d8cf5a4e9 to your computer and use it in GitHub Desktop.
Echo servers
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import socket, threading | |
| serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
| serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | |
| serversocket.bind(('0.0.0.0', 8082)) | |
| serversocket.listen(5) | |
| def connection_handler(socket): | |
| while True: | |
| data = socket.recv(1024) | |
| if not data: # https://manpages.debian.org/buster/manpages-dev/recv.2.en.html#RETURN_VALUE | |
| return 'gg' | |
| socket.send(data) | |
| while True: | |
| connectiontoclient, address = serversocket.accept() | |
| t = threading.Thread(target=connection_handler, args=(connectiontoclient,)) | |
| t.start() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import socket, threading, time, select | |
| serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
| serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | |
| serversocket.bind(('0.0.0.0', 811)) | |
| serversocket.listen(5) | |
| connections = set() | |
| def ready_handler(sockets, writable): | |
| for socket in sockets: | |
| data = socket.recv(1024) | |
| if not data: | |
| connections.remove(socket) | |
| if socket in writable: | |
| try: | |
| socket.send(data) | |
| except: | |
| pass | |
| def select_checker(): | |
| while True: | |
| ready, writable, error = select.select(connections,connections,connections, 2) | |
| if ready: | |
| ready_handler(ready, writable) | |
| t = threading.Thread(target=select_checker) | |
| t.start() | |
| # init socket connections list | |
| # spawn connection accepter, add to list when connected | |
| # spawn checker, every 1 second sleep and run select | |
| # if checker sees some stuff, run read_operation | |
| while True: | |
| connectiontoclient, address = serversocket.accept() | |
| connections.add(connectiontoclient) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment