in one terminal:
python processor.py
in another terminal:
nc -U /tmp/my_unix_socket
and in the nc window, type asdf and press enter
| import socket | |
| import subprocess | |
| import os | |
| import time | |
| # Define the path for the Unix domain socket | |
| SOCKET_PATH = "/tmp/unix_domain_socket_example" | |
| # Ensure the socket doesn't already exist | |
| if os.path.exists(SOCKET_PATH): | |
| os.unlink(SOCKET_PATH) | |
| # Function to start a subprocess that listens on the Unix domain socket | |
| def start_subprocess(): | |
| # Start a subprocess that listens on the Unix socket | |
| return subprocess.Popen( | |
| ['sh', '-c', f""" | |
| while true; do | |
| if [ -S "{SOCKET_PATH}" ]; then | |
| nc -lU "{SOCKET_PATH}" | while read line; do | |
| echo "Received: $line" | |
| sleep 1 | |
| done | |
| fi | |
| done | |
| """], | |
| stdout=subprocess.PIPE, | |
| stderr=subprocess.PIPE | |
| ) | |
| # Create a Unix domain socket | |
| server_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) | |
| server_socket.bind(SOCKET_PATH) | |
| server_socket.listen(1) | |
| # Start the subprocess | |
| subprocess_listener = start_subprocess() | |
| print("Subprocess started and listening on the Unix domain socket...") | |
| # Connect to the Unix domain socket as a client | |
| client_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) | |
| client_socket.connect(SOCKET_PATH) | |
| print("") | |
| # Send a request to the subprocess through the socket | |
| client_socket.sendall(b"Hello from the client\n") | |
| # Receive streaming output from the subprocess | |
| def receive_stream(): | |
| while True: | |
| output = subprocess_listener.stdout.readline() | |
| if output == b"" and subprocess_listener.poll() is not None: | |
| break | |
| if output: | |
| print(f"Subprocess output: {output.decode().strip()}") | |
| # Start receiving the stream output | |
| try: | |
| receive_stream() | |
| finally: | |
| # Cleanup | |
| client_socket.close() | |
| server_socket.close() | |
| subprocess_listener.terminate() | |
| os.unlink(SOCKET_PATH) | |
| print("Sockets closed and subprocess terminated.") |
| import socket | |
| import os | |
| # Specify the path for the Unix domain socket | |
| SOCKET_PATH = "/tmp/my_unix_socket" | |
| # Ensure the socket path doesn't already exist | |
| if os.path.exists(SOCKET_PATH): | |
| os.unlink(SOCKET_PATH) | |
| # Create a Unix domain socket | |
| server_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) | |
| # Bind the socket to the specified path | |
| server_socket.bind(SOCKET_PATH) | |
| # Start listening for incoming connections | |
| server_socket.listen(1) | |
| print(f"Listening on {SOCKET_PATH}") | |
| try: | |
| # Wait for a client to connect | |
| connection, client_address = server_socket.accept() | |
| print("Client connected") | |
| # Stream data back to the client | |
| with connection: | |
| while True: | |
| # Receive data from the client | |
| data = connection.recv(1024) | |
| if not data: | |
| break | |
| print(f"Received: {data.decode().strip()}") | |
| # Process data and send a response back to the client | |
| response = f"Echoing back: {data.decode().strip()}\n" | |
| connection.sendall(response.encode()) | |
| print(f"Sent: {response.strip()}") | |
| finally: | |
| # Cleanup | |
| server_socket.close() | |
| os.unlink(SOCKET_PATH) | |
| print("Socket closed and cleaned up.") |