def __init__(self, verbose=1, maxq=200): Net.__init__(self) Tools.__init__(self) """ Multithreaded network tools """ self.verbose = verbose self.maxq = maxq self.timeout = 0.2 # self.buffers = 256 #for check_port
def __init__(self): # run the super initializer Net.__init__(self) # add the specific arguments for a client server self.parser.add_argument('-f', metavar='filename', type=str, help='The filename of a file to write/read') self.parser.add_argument('-a', metavar='address', type=str, help='The ip address of the server') self.parser.add_argument('-w', action='store_true', help='Flag for writing a file') self.parser.add_argument('-r', action='store_true', help='Flag for reading a file') self.parser.add_argument('-k', action='store_true', help='Flag for killing the server') # parse the arguments args = self.parser.parse_args() server_connection = (args.a, args.p) # if you want to kill, open connection, and send kill if args.k: self.sock.sendto(Packet.kill(), server_connection) exit(0) if not path.exists(args.f): print("File not found, please enter a valid filename") exit(0) # Creating connection to server # source port is 0 since the connection has been made yet print("Initiating connection") self.sock.sendto( Packet.request(args.f, args.w, args.p, 0, self.seq_number).binary_combine(), server_connection) self.sock.settimeout(2) try: syn_ack, address = self.sock.recvfrom(1472) read_syn = Packet.read_packet(syn_ack) if read_syn[1]: if read_syn[0] == "Ack Syn": print( "Proper ack received, send ack back, then data/waiting for data" ) self.port = read_syn[3] window_size = read_syn[5] ack = read_syn[2] + len(syn_ack) self.sock.sendto( Packet.ack(self.seq_number, ack, args.p, self.port, window_size, syn=True).binary_combine(), server_connection) if args.w: self.send_data(args.f, window_size, args.a, args.p, self.sock) else: self.receive_data(args.f, self.sock, args.p, window_size, ack, args.a) else: print("Improper ack received, please try connection again") self.sock.close() exit(0) else: print( "Error in the checksum for ack syn, please try connection again" ) self.sock.close() exit(0) except socket.timeout: print("Connection time out, connection not established") exit(0)
def __init__(self): # Run super initializer Net.__init__(self) # parse the arguments args = self.parser.parse_args() self.port = args.p self.win_size = random.randint(4, 9) while True: self.re_sock() self.sock.bind(('', args.p)) print("Server IP: " + str(self.sock.getsockname()) + "\nPort number: " + str( args.p) + "\nWaiting for connection") self.sock.settimeout(None) message, address = self.sock.recvfrom(1472) decoded_message = Packet.read_packet(message) # Kill packet received if decoded_message[0] == 'end': self.sock.close() exit(0) if decoded_message[1]: if decoded_message[0] == "Syn": print("Connection requested from " + str(address)) print("Sending syn ack...") ack = decoded_message[2] write_flag = decoded_message[3] filename = decoded_message[4] self.sock.sendto(Packet.ack(self.seq_number, ack, address[1], self.port, self.win_size, syn=True).binary_combine(), address) self.sock.settimeout(2) try: message, address = self.sock.recvfrom(1472) decoded_message = Packet.read_packet(message) if decoded_message[1]: if decoded_message[0] == "Ack Syn": print("Three way handshake confirmed") if write_flag: # Since a file added to the server will be preappended with 'new', this needs to be checked as well if path.exists(filename) or path.exists('new'+filename): print("Trying to send a file that already exists, sending error, closing " "connection") return_packet = Packet.error(6, address[1], self.port, self.seq_number) self.sock.sendto(return_packet.binary_combine(), address) else: print("Ready to receive data...") Net.receive_data(self, "new" + filename, self.sock, address[1], self.win_size, ack, address[0]) else: if path.exists('new' + filename): pathname = 'new' + filename else: pathname = filename # Sending a file not found error, this is redundant check if there is a 'new' + filename but if there # isn't one this one checks for the original name if not path.exists(pathname): print("trying to send a file that doesn't exist, sending error, closing " "connection") send_packet = Packet.error(1, address[1], self.port, self.seq_number) self.sock.sendto(send_packet.binary_combine(), address) else: print("Sending data...") Net.send_data(self, pathname, self.win_size, address[0], address[1], self.sock) except socket.timeout as e: print("Syn ack timeout, connection refused")