Skip to content

Instantly share code, notes, and snippets.

@acdimalev
Last active January 15, 2022 21:06
Show Gist options
  • Save acdimalev/2558804d922a3bce30d14b1ef045a107 to your computer and use it in GitHub Desktop.
Save acdimalev/2558804d922a3bce30d14b1ef045a107 to your computer and use it in GitHub Desktop.
IRC client experiments
from socket import create_server
MAX_SOCKETS = 1024
BUFFER_SIZE = 4096
sockets = [(0, None)] * MAX_SOCKETS
buffers = [b''] * MAX_SOCKETS
connections = []
# invert EOF behavior
def fancyrecv(socket, buffersize):
if 0 == buffersize:
return b''
try:
buffer = socket.recv(buffersize)
except BlockingIOError:
return b''
if 0 == len(buffer):
raise EOFError
else:
return buffer
server = create_server(("localhost", 6667))
server.setblocking(False)
# FIXME: server should gracefully handle interrupts for termination
while True:
# handle connections
# one per iteration
try:
(socket, _) = server.accept()
socket.setblocking(False)
i = [x[1] for x in sockets].index(None)
sockets[i] = (1 + sockets[i][0], socket)
buffers[i] = b''
connections.append(i)
print(f"received connection {i}")
except BlockingIOError:
pass
except ValueError:
socket.close()
# read from connections
for (n, i) in enumerate(connections):
try:
recvbuf = fancyrecv(sockets[i][1], BUFFER_SIZE - len(buffers[i]))
if recvbuf:
print(f"{i} > {recvbuf}")
buffers[i] += recvbuf
except EOFError:
sockets[i][1].close()
sockets[i] = (sockets[i][0], None)
connections[n] = None
print(f"closed connection {i}")
connections = [x for x in connections if x is not None]
import socket, time
f = open('test_irc_connection.txt', 'w')
def write(s):
f.write(s + '\n')
print(s)
write("connect to localhost without a password")
with socket.socket() as server:
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(("localhost", 6667))
server.listen()
(conn, addr) = server.accept()
conn.setblocking(False)
for i in range(3):
try:
buffer = conn.recv(4096)
write(''.join(f'{i}> {x}\n' for x in buffer.decode().splitlines()))
except BlockingIOError:
pass
time.sleep(0.1)
time.sleep(2)
write("connect to localhost with a password")
with socket.socket() as server:
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(("localhost", 6667))
server.listen()
(conn, addr) = server.accept()
conn.setblocking(False)
for i in range(3):
try:
buffer = conn.recv(4096)
write(''.join(f'{i}> {x}\n' for x in buffer.decode().splitlines()))
except BlockingIOError:
pass
time.sleep(0.1)
time.sleep(2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment