def Update_Window(): filename = "input.txt" with open(filename) as f: content = f.read() global window global window_size global window_condition global SEGMENT_SIZE global sent_number_of_segment global ofset global updateWindow global is_Update_Window_ACTIVE while ofset < len(content): if updateWindow == True: lock.acquire()#lock print "window acquiring..." print "ofset = " + str(ofset) print "len(content) = " + str(len(content)) if updateWindow == True: window = [] window_condition = [] updateWindow = False seq = 0 print "window updating..." while True: if ofset + SEGMENT_SIZE > len(content): segment = content[ofset:] window.append(ip_checksum(segment) + str(seq) + segment) window_condition.append(1) ofset = len(content) break else: segment = content[ofset: ofset + SEGMENT_SIZE] ofset += SEGMENT_SIZE window.append(ip_checksum(segment) + str(seq) + segment) window_condition.append(1) seq += 1 #print window_condition if len(window) == window_size: break time.sleep(0.01) print "window releasing..." lock.release()#unlock print "Update_Window is finishing..." is_Update_Window_ACTIVE = False
def Get_Packet(dest, listen): global window global window_condition global update_Window_and_write_to_file_FLAG global numberofActive_Get_Packet global half send_sock = socket(AF_INET, SOCK_DGRAM) recv_sock = socket(AF_INET, SOCK_DGRAM) recv_sock.bind(listen) recv_sock.settimeout(20) while True: if sum(window_condition) != len(window_condition): # lock.acquire()#lock try: message, address = recv_sock.recvfrom(1000) message_list = message.split(' ', 2) checksum = message[:2] seq = int(message[2]) content = message[3:] print "taken seq is " + str(seq) print "-----------------------" if ip_checksum(content) == checksum: print window_condition if window_condition[ seq] == -1: #implementing of window and pipelining taken packets displayed as 1 , waiting packets -1 on client if (half == 0 and seq < len(window) / 2) or ( half == 1 and seq >= len(window) / 2): window_condition[seq] = 1 # seq th is taken window[seq] = content checksum = ip_checksum(str(seq)) print "sending seq is " + str(seq) send_sock.sendto(checksum + " " + str(seq), dest) if half == 0 and sum(window_condition) == 0: half = 1 if sum(window_condition) == len(window_condition): update_Window_and_write_to_file_FLAG = True half = 0 elif half == 0 and seq >= len(window) / 2: checksum = ip_checksum(str(seq)) send_sock.sendto(checksum + " " + str(seq), dest) print "sending seq is " + str(seq) else: seq = -1 checksum = ip_checksum(str(seq)) send_sock.sendto(checksum + " " + str(seq), dest) print "half error sending seq is -1" else: checksum = ip_checksum(str(seq)) send_sock.sendto(checksum + " " + str(seq), dest) print "sending seq is " + str(seq) else: seq = -1 checksum = ip_checksum(str(seq)) send_sock.sendto(checksum + " " + str(seq), dest) print "checksum error sending seq is -1" # lock.release()#unlock except timeout: print "timeout" # lock.release()#unlock break numberofActive_Get_Packet -= 1 if numberofActive_Get_Packet <= 0: update_Window_and_write_to_file_FLAG = True
def send(content, to): checksum = ip_checksum(content) send_sock.sendto(checksum + content, to)
recv_sock.bind(listen) recv_sock.settimeout(1) offset = 0 seq = 0 while offset < len(content): if offset + SEGMENT_SIZE > len(content): segment = content[offset:] else: segment = content[offset:offset + SEGMENT_SIZE] offset += SEGMENT_SIZE ack_received = False while not ack_received: send_sock.sendto(ip_checksum(segment) + str(seq) + segment, dest) try: message, address = recv_sock.recvfrom(4096) except timeout: print "Timeout" else: print message checksum = message[:2] ack_seq = message[5] if ip_checksum( message[2:]) == checksum and ack_seq == str(seq): ack_received = True seq = 1 - seq
recv_sock.bind(listen) recv_sock.settimeout(1) offset = 0 seq = 0 while offset < len(content): if offset + SEGMENT_SIZE > len(content): segment = content[offset:] else: segment = content[offset:offset + SEGMENT_SIZE] offset += SEGMENT_SIZE ack_received = False while not ack_received: send_sock.sendto(ip_checksum(segment) + str(seq) + segment, dest) try: message, address = recv_sock.recvfrom(4096) except timeout: print "Timeout" else: print message checksum = message[:2] ack_seq = message[5] if ip_checksum(message[2:]) == checksum and ack_seq == str(seq): ack_received = True seq = 1 - seq
if __name__ == "__main__": dest_addr = argv[1] dest_port = int(argv[2]) dest = (dest_addr, dest_port) listen_addr = argv[3] listen_port = int(argv[4]) listen = (listen_addr, listen_port) send_sock = socket(AF_INET, SOCK_DGRAM) recv_sock = socket(AF_INET, SOCK_DGRAM) recv_sock.bind(listen) expecting_seq = 0 while True: message, address = recv_sock.recvfrom(4096) checksum = message[:2] seq = message[2] content = message[3:] if ip_checksum(content) == checksum: send("ACK" + seq, dest) if seq == str(expecting_seq): stdout.write(content) expecting_seq = 1 - expecting_seq else: negative_seq = str(1 - expecting_seq) send("ACK" + negative_seq, dest)