commit ccd9753276b6e776ae6e85ed574cab5fef065e4e
Author: Pascal Engélibert <tuxmain@zettascript.org>
Date:   Sat Jan 27 17:56:24 2024 +0100

    Initial commit

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..bee8a64
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+__pycache__
diff --git a/demo.py b/demo.py
new file mode 100644
index 0000000..49ebf5a
--- /dev/null
+++ b/demo.py
@@ -0,0 +1,16 @@
+import network, sys, time
+
+sock = network.Sock()
+
+port = int(sys.argv[2])
+
+if sys.argv[1] == "s":
+	sock.listen(("0.0.0.0", port))
+	while True:
+		for (d, a) in sock.poll():
+			print(d, a)
+		time.sleep(0.1)
+elif sys.argv[1] == "c":
+	while True:
+		sock.send(str(time.time()), (sys.argv[3], port))
+		time.sleep(1)
diff --git a/network.py b/network.py
new file mode 100644
index 0000000..7ae6164
--- /dev/null
+++ b/network.py
@@ -0,0 +1,38 @@
+import socket
+from threading import Thread, Lock
+
+class Sock:
+	def __init__(self):
+		self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+		self.queue = []
+		self.queue_lock = Lock()
+		self.sock_thread = None
+	
+	def send(self, message, address):
+		self.sock.sendto(message, address)
+	
+	def listen(self, address, length=65535):
+		self.sock_thread = SockThread(self, address, length)
+		self.sock_thread.start()
+	
+	def poll(self):
+		if len(self.queue_lock) == 0:
+			return []
+		with self.queue_lock:
+			queue = self.queue
+			self.queue = []
+		return queue
+
+class SockThread(Thread):
+	def __init__(self, sock, address, length):
+		super.__init__(super)
+		self.sock = sock
+		self.sock.sock.bind(address)
+		self.length = self.length
+		self.sock.sock.bind(address)
+	
+	def run(self):
+		while True:
+			r = self.sock.sock.recv(self.length)
+			with self.sock.queue_lock:
+				self.sock.queue.append(r)