コード例 #1
0
 def receive_response(self):
     print("Started receiving response.")
     while True:
         data, sender = self.socket_object.recvfrom(1024)
         pkt = Packet.from_bytes(data)
         if pkt.packet_type == packet.DATA or pkt.packet_type == packet.FIN:
             self.add_to_buffer(Packet.from_bytes(data))
コード例 #2
0
ファイル: udp_client.py プロジェクト: kdss91/CN_Assignments
def run_client(router_addr, router_port, server_addr, server_port):
    peer_ip = ipaddress.ip_address(socket.gethostbyname(server_addr))
    conn = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    timeout = 5
    try:
        msg = "Hello World"
        p = Packet(packet_type=0,
                   seq_num=1,
                   peer_ip_addr=peer_ip,
                   peer_port=server_port,
                   payload=msg.encode("utf-8"))
        conn.sendto(p.to_bytes(), (router_addr, router_port))
        print('Send "{}" to router'.format(msg))

        # Try to receive a response within timeout
        conn.settimeout(timeout)
        print('Waiting for a response')
        response, sender = conn.recvfrom(1024)
        p = Packet.from_bytes(response)
        print('Router: ', sender)
        print('Packet: ', p)
        print('Payload: ' + p.payload.decode("utf-8"))

    except socket.timeout:
        print('No response after {}s'.format(timeout))
    finally:
        conn.close()
コード例 #3
0
 def send_ack(self, pkt):
     global client_ip
     global router
     new_ip = ipaddress.ip_address(socket.gethostbyname(client_ip))
     tmp_pkt = Packet(packet_type=packet.ACK,
                      seq_num=pkt.seq_num,
                      peer_ip_addr=new_ip,
                      peer_port=self.client_port,
                      payload=b'')
     print("Sending Ack#", str(pkt.seq_num))
     self.socket_object.sendto(tmp_pkt.to_bytes(), router)
コード例 #4
0
 def look_ack(self):
     # We are continuously looking for acks
     while not self.received_all_acks:
         # What we are receiving
         data, sender = self.socket_object.recvfrom(1024)
         pkt = Packet.from_bytes(data)
         if pkt.packet_type == packet.ACK:
             self.receive_ack(data)
     self.received_all_acks = False
コード例 #5
0
    def handle_packet(self, data, sender):
        """receive request from the client and send response"""
        self.print_debug(
            "Connection established with router " + sender[0] + ":" +
            str(sender[1]) + " at " +
            time.strftime("%a, %d %b %Y %I:%M:%S %p %Z", time.gmtime()))
        pkt = Packet.from_bytes(data)
        if pkt.packet_type == packet.SYN:
            self.print_debug("SYN packet received.")
            new_ip = ipaddress.ip_address(socket.gethostbyname(client_ip))
            new_pkt = Packet(packet.SYN_ACK, pkt.seq_num, new_ip,
                             self.client_port, ''.encode('utf-8'))
            self.socket_object.sendto(new_pkt.to_bytes(), sender)
            print("Sending syn-ack")
            print("Handshaking is done from side of server")
            self._handshake_done = True

        # When data of ACK packet comes
        elif self._handshake_done:
            if pkt.packet_type == packet.DATA or pkt.packet_type == packet.FIN:
                print("Data#", str(pkt.seq_num))
                print(pkt.payload.decode('utf-8'))
                self.add_to_buffer(pkt)
コード例 #6
0
 def perform_handshaking(self, client_port):
     global server_ip
     global router
     new_ip = ipaddress.ip_address(socket.gethostbyname(server_ip))
     pkt = Packet(packet.SYN, Packet.packet_num, new_ip, self.server_port,
                  ''.encode('utf-8'))
     self.socket_object.bind(('127.0.0.1', client_port))
     self.socket_object.sendto(pkt.to_bytes(), router)
     res, rout = self.socket_object.recvfrom(1024)
     pkt = Packet.from_bytes(res)
     if pkt.packet_type == packet.SYN_ACK:
         print("Received SYN-ACK packet.")
         new_pkt = Packet(packet.ACK, pkt.seq_num, new_ip, self.server_port,
                          ''.encode('utf-8'))
         self.socket_object.sendto(new_pkt.to_bytes(), rout)
     else:
         print("Received an invalid packet during handshaking.")
         self.perform_handshaking(client_port)
コード例 #7
0
    def receive_ack(self, data):
        pkt = Packet.from_bytes(data)
        print("Started receiving ack#", str(pkt.seq_num))
        # These are for ack window size
        start = self.sent_pkt_window[0].seq_num
        end = self.sent_pkt_window[len(self.sent_pkt_window) - 1].seq_num

        # Check if fin is contained or not
        contains_fin = False
        for pkts in self.sent_pkt_window:
            if pkts.packet_type == packet.FIN:
                contains_fin = True

        # getting only valid acks
        if pkt.packet_type == packet.ACK and start <= pkt.seq_num <= end:
            self.ack_window_lock.acquire()
            # add to ack_window
            self.all_acks_list.append(pkt.seq_num)
            self.ack_window.append(pkt.seq_num)
            # if all acks for window have been received
            if len(set(self.ack_window)) == len(self.sent_pkt_window):
                self.received_all_acks = True  # This will close the while loop for receving acks   # all acks are received
                self.check_flag_aks = True  # All acks are received for
                print("Current Window acks are receved,:", self.ack_window)

                # this means every data packet has been sent and ack have been received
                if contains_fin:
                    print("Received ack#", str(pkt.seq_num))
                    self.received_acks_for_all_data = True
                    print(
                        "Received acks for all data, continue to receive response."
                    )
                    if self.ack_window_lock.locked():
                        self.ack_window_lock.release()  # I added this
                    threading.Thread(target=self.receive_response,
                                     args=()).start()
                    return
            else:
                # continue receiving acks
                print("Received ack#", pkt.seq_num)
            if self.ack_window_lock.locked():
                self.ack_window_lock.release()
コード例 #8
0
    def create_payload_packets(self, payload, last_pkt):
        print("Creating packets started")
        global client_ip
        global router
        self.res_conf2()
        MAX_PAYLOAD = packet.MAX_LEN - packet.MIN_LEN
        current_byte = [0, 0]

        def num_bytes(n):
            current_byte[0], current_byte[1] = current_byte[
                1], current_byte[1] + n
            return payload[current_byte[0]:current_byte[1]]

        remaining_data = len(payload)  # initialize
        tmp = last_pkt
        print("Payload:", payload)
        self.all_acks_list = self.received_pkt_list
        while remaining_data > 0:
            self.res_conf2()
            while self.pkt_sent_count < self.window_size:
                print("sending packet %d", tmp)
                if remaining_data > MAX_PAYLOAD:
                    tmp = tmp + 1
                    new_ip = ipaddress.ip_address(
                        socket.gethostbyname(client_ip))
                    p = Packet(packet_type=packet.DATA,
                               seq_num=tmp,
                               peer_ip_addr=new_ip,
                               peer_port=self.client_port,
                               payload=num_bytes(MAX_PAYLOAD))
                    self.socket_object.sendto(p.to_bytes(), router)
                    threading.Thread(target=self.look_ack, args=()).start()
                    self.sent_pkt_window.append(p)

                    # Increase Send window +1
                    self.pkt_sent_count += 1

                    # decreasing payload
                    remaining_data -= MAX_PAYLOAD
                    Packet.packet_num += 1
                    # For same packet we are threading for resend
                    threading.Thread(target=self.check_resend_pkt,
                                     args=(p, )).start()
                    print("not last packet")
                else:
                    tmp += 1
                    new_ip = ipaddress.ip_address(
                        socket.gethostbyname(client_ip))
                    p = Packet(packet_type=packet.FIN,
                               seq_num=tmp,
                               peer_ip_addr=new_ip,
                               peer_port=self.client_port,
                               payload=num_bytes(remaining_data))
                    self.socket_object.sendto(p.to_bytes(), router)
                    """We have fin number also"""
                    self.fin_num = tmp
                    self.sent_pkt_window.append(p)
                    threading.Thread(target=self.look_ack, args=()).start()
                    self.pkt_sent_count += 1
                    remaining_data -= remaining_data
                    print("remaining data " + str(remaining_data))
                    print("is last packet")
                    threading.Thread(target=self.check_resend_pkt,
                                     args=(p, )).start()
                    break
            while not self.check_flag_aks:
                pass
            self.check_flag_aks = False  # I changed it from True to False
            self.pkt_sent_count = 0
コード例 #9
0
 def handle_packet(self, data, sender):
     pkt = Packet.from_bytes(data)
     if pkt.packet_type == packet.DATA or pkt.packet_type == packet.FIN:
         # send ack
         print("Received response-pkt#", str(pkt.seq_num))
コード例 #10
0
    def create_payload_packets(self, payload):
        print("Creating packets started")
        global server_ip
        global router
        self.res_configuration()
        MAX_PAYLOAD = packet.MAX_LEN - packet.MIN_LEN
        current_byte = [0, 0]

        def num_bytes(n):
            current_byte[0], current_byte[1] = current_byte[
                1], current_byte[1] + n
            return payload[current_byte[0]:current_byte[1]]

        remaining_data = len(payload)  # initialize

        while remaining_data > 0:
            # To reset configuration
            self.res_configuration()
            while self.pkt_sent_count < self.window_size:
                print("sending packet %d" % Packet.packet_num)
                # this is to create packet
                if remaining_data > MAX_PAYLOAD:
                    new_ip = ipaddress.ip_address(
                        socket.gethostbyname(server_ip))
                    p = Packet(packet_type=packet.DATA,
                               seq_num=Packet.packet_num,
                               peer_ip_addr=new_ip,
                               peer_port=self.server_port,
                               payload=num_bytes(MAX_PAYLOAD))
                    # send created packed
                    self.socket_object.sendto(p.to_bytes(), router)
                    threading.Thread(target=self.look_ack, args=()).start()
                    # What ever you are sending append to sent window
                    self.sent_pkt_window.append(p)
                    # Increase Send window +1
                    self.pkt_sent_count += 1

                    # decreasing payload
                    remaining_data -= MAX_PAYLOAD
                    self.next_pkt_num += 1
                    Packet.packet_num += 1
                    # For same packet we are threading for resend
                    threading.Thread(target=self.check_resend_pkt,
                                     args=(p, )).start()
                    print("not last packet")
                else:
                    new_ip = ipaddress.ip_address(
                        socket.gethostbyname(server_ip))
                    p = Packet(packet_type=packet.FIN,
                               seq_num=Packet.packet_num,
                               peer_ip_addr=new_ip,
                               peer_port=self.server_port,
                               payload=num_bytes(remaining_data))
                    self.socket_object.sendto(p.to_bytes(), router)
                    self.fin_num = Packet.packet_num  # To use in response
                    self.last_window_seq_num = self.fin_num
                    self.sent_pkt_window.append(p)
                    self.pkt_sent_count += 1
                    remaining_data -= remaining_data
                    threading.Thread(target=self.look_ack, args=()).start()
                    self.next_pkt_num += 1
                    print("remaining data " + str(remaining_data))
                    print("is last packet")
                    threading.Thread(target=self.check_resend_pkt,
                                     args=(p, )).start()
                    break
            while not self.check_flag_aks:
                pass
            self.check_flag_aks = False  # I changed it from True to False
            self.pkt_sent_count = 0  # I have done it