#!/usr/bin/env python3 import socket from time import sleep import sys import argparse import threading PORT = 3791 # Command Line Interface parser = argparse.ArgumentParser() parser.add_argument("-ip", dest="IP", required=True, help="IP adress of the partner Peer") parser.add_argument("-p --port", dest="port", type=int, default=PORT, help="The port the other Peer is listening") args = parser.parse_args() IP = args.IP PORT = args.port print("trying to connect to peer @ %s : %i"%(IP,PORT)) # Set up socket sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(("",3791)) sock.settimeout(2) data = b"" addr = () # Set up the thread ecosystem running = True def user_input(): global running while running: try: data = input("> ") sock.sendto(data.encode(), (IP,PORT)) except (KeyboardInterrupt, SystemExit): running = False def receiver(): global running while running: sock.sendto(b"", (IP,PORT)) # keep alive packet try: data, addr = sock.recvfrom(512) if data != b"": print(data.decode()) except socket.timeout: continue except (KeyboardInterrupt, SystemExit): running = False thUserInput = threading.Thread(target=user_input, name="User Input") thReceiver = threading.Thread(target=receiver, name="Receiver") # Connect to the peer try: while data != b"WAT" or addr!=(IP,PORT): sock.sendto(b"WAT", (IP,PORT)) #print("sended WAT") try: data, addr = sock.recvfrom(50) except socket.timeout: #print("nothing received") continue print("%s\t%s"%(repr(addr),data.decode())) sock.sendto(b"WAT", (IP,PORT)) #print("sended WAT") except Exception as e: print("Failed: %s"%e) sock.close() sys.exit() print("successfully connected") # sock.settimeout(.5) thUserInput.start() thReceiver.start() try: while True: pass # one could actually do something useful here except (KeyboardInterrupt, SystemExit): print("\n\n closing connection") finally: running = False thUserInput.join() thReceiver.join() sock.sendto(b"BYE", (IP,PORT)) sock.close()