def inner_loop(socket_out, socket_in, bytes_to_send, next_no): """ Function to continuously send a packet until a valid acknowledgement packet is recieved. Returns the number of packets sent from sender to achieve successful transmission. """ packets_sent = 0 while True: # Send packet socket_out.send(bytes_to_send) packets_sent += 1 # Await a response readable, _, _ = select.select([socket_in], [], [], TIMEOUT) if readable: # got a response s = readable[0] data = s.recv(1024) rcvd = Packet() rcvd.decode(data) if rcvd.is_valid_ack(next_no): # got a valid acknowledgement packet next_no = 1 - next_no return packets_sent, next_no
def handlePacket(self, packet, client): packet = Packet.decode(packet) print(f"{self.logPrefix()}: received {packet} from {client}") if packet.type == PacketType.NEGOTIATION: if clients[client]["state"] not in [ State.INITIAL, State.NEGOTIATION_FAILED ]: clients[client]["state"] = State.INITIAL clients[client]["lastACK"] = self.frame_idx if packet.width == 1920 and packet.height == 1080: reply = ResponsePacket(True) clients[client]["state"] = State.ESTABLISHED else: reply = ResponsePacket(False) clients[client]["state"] = State.NEGOTIATION_FAILED self.sendPacket(reply, client) elif packet.type == PacketType.ACK: clients[client]["lastACK"] = packet.frame_idx elif packet.type == PacketType.FINISH: clients[client]["state"] = State.FINISHED else: return #dunno, mate. client f****d up.
def next_event(self): raw_bytes = self.serial.read(Packet.PACKET_LENGTH) if DEBUG: print(hex(int.from_bytes(raw_bytes,byteorder='big'))) packet = Packet.decode(raw_bytes) if packet is not None: return X10Event(packet) return None
def packet_read(self, conn, raw_packet): """ Read in a packet and dispatch -- asyncore callback. """ packet = Packet.decode(raw_packet) print "packet in with protocol" if Packet.is_named(packet.protocol): # protocol is named, resolve id first name = packet.protocol id = self.server_map.resolve_id(name) if id: named = MappedName() named.name = name named.id = id msg = Message(0, named) self.q_out.fifo_put((conn, msg)) else: print "unmapped name: " + str(name) rejected = MessageRejected() rejected.id = 0 rejected.reason = rejected.UNMAPPED_NAME rejected.message = "Unmapped name: '%s'" % name msg = Message(0, rejected) self.q_out.fifo_put((conn, msg)) # stop processing return else: # just take id id = packet.protocol # this seems slightly silly in the case where the message was # a named message (it shouldn't hurt though) name = self.server_map.resolve_name(id) if not name: # if the reverse name lookup fails print "unmapped id: " + str(id) rejected = MessageRejected() rejected.id = 0 rejected.reason = rejected.UNMAPPED_ID rejected.message = "Unmapped ID: %d" % id msg = Message(0, rejected) self.q_out.fifo_put((conn, msg)) # stop processing return protobuf_class = self.server_map.resolve_protobuffer(name) assert protobuf_class protobuf = protobuf_class() protobuf.ParseFromString(packet.payload) message = Message(packet.track_id, protobuf, name=name) print "have protobuf: {" + str(protobuf) + "}" self.q_in.fifo_put((conn, message))
def size(conn, httpc, num): timeout = 5 try: p = Packet() p.encode("Data", 0, httpc.host, httpc.port, str(num)) conn.sendto(p.to_send(), ("localhost", 3000)) conn.settimeout(timeout) response, sender = conn.recvfrom(1024) p.decode(response) p.prnt() print("Size Delivered\n") except socket.timeout: print("Timeout Expired: " + str(timeout) + "s\n")
def hand_shake(conn): ack = 0 seq = 0 state = "" p = Packet() timeout = 60 timeout2 = 5 while state != "ESTABLISHED": try: sentence, sender = conn.recvfrom(1024) conn.settimeout(timeout) p = Packet() p.decode(sentence) p.prnt() port = p.PeerPortNumber ack = int(p.SequenceNumber) + 1 except socket.timeout: print("Wating for initiated Hand Shake\n") if p.PacketType == "SYN": try: p.encode("SYN-ACK",seq,"127.0.0.1",port,str(ack)) conn.sendto(p.to_send(), sender) conn.settimeout(timeout2) except socket.timeout: print("Timeout Expired in Sending SYN: " + str(timeout) + "s\n") if p.PacketType == "ACK": seq = int(p.Payload)+1 state = "ESTABLISHED" print(state + "\n") return port
def fin(conn, httpc): ack = 0 seq = 0 terminate = 0 status = "" output = "" timeout = 5 while status != "PENDING": try: p = Packet() p.encode("FIN", seq, httpc.host, httpc.port, "") conn.sendto(p.to_send(), ("localhost", 3000)) conn.settimeout(timeout) response, sender = conn.recvfrom(1024) p.decode(response) p.prnt() if p.PacketType == "Data": output = p.Payload print("Received final file from server") response, sender = conn.recvfrom(1024) p.decode(response) p.prnt() if p.PacketType == "ACK": status = "PENDING" print(status + "\n") except socket.timeout: print("Timeout Expired: " + str(timeout) + "s\n") while status != "TERMINATED": try: p = Packet() response, sender = conn.recvfrom(1024) p.decode(response) p.prnt() if p.PacketType == "FIN": p.encode("ACK", seq, httpc.host, httpc.port, str(0)) status = "TERMINATED" print(status + "\n") conn.sendto(p.to_send(), ("localhost", 3000)) conn.settimeout(timeout) except socket.timeout: print("Timeout Expired: " + str(timeout) + "s\n") break return output
def process_packet(data, drop_rate): """ Process an input packet (as bytes) and randomly drop it or change its header. Returns the input packet as bytes. Returns the null byte if the input data is the null byte. """ if data == b'': return data p = Packet() p.decode(data) if p.magic_no != MAGIC_NO: # magic numbers is wrong: drop it return None elif random.uniform(0, 1) < drop_rate: # drop packet by random chance return None elif random.uniform(0, 1) < BIT_ERR_RATE: # create a bit error by random chance (increase data len field randomly) p.data_len += random.randint(1, 10) return p.encode() # return the packet's byte conversion
def hand_shake(conn, httpc): ack = 0 seq = 0 state = "" p = Packet() p.encode("SYN", seq, httpc.host, httpc.port, "") timeout = 5 while state != "ESTABLISHED": try: conn.sendto(p.to_send(), ("localhost", 3000)) conn.settimeout(timeout) response, sender = conn.recvfrom(1024) p.decode(response) p.prnt() if p.PacketType == "SYN-ACK": ack = p.SequenceNumber + 1 seq = int(p.Payload) + 1 p.encode("ACK", seq, httpc.host, httpc.port, str(ack)) conn.sendto(p.to_send(), ("localhost", 3000)) state = "ESTABLISHED" print(state + "\n") except socket.timeout: print("Timeout Expired: " + str(timeout) + "s\n")
def size(conn,port): timeout = 5 try: sentence, sender = conn.recvfrom(1024) p = Packet() p.decode(sentence) p.prnt() num = int(p.Payload) #port = p.PeerPortNumber p.encode("ACK",p.SequenceNumber,"127.0.0.1",port,str(num)) conn.sendto(p.to_send(), sender) conn.settimeout(timeout) print("Size received: " + str(num) + "\nInitializing Buffer\n") except socket.timeout: print("Timeout Expired in size: " + str(timeout) + "s\n") return num
def datagramReceived(self, data, addr): packet = Packet.decode(data) #print(packet) if packet.type == PacketType.FRAME: if packet.frame_idx not in frames: frames[packet.frame_idx] = {} frames[packet.frame_idx][packet.sequence_idx] = packet.frame_data if len(frames[packet.frame_idx]) == packet.sequence_total: now = get_us() interarrival_time = now - self.previous_packet_time - packet.grace_period self.previous_packet_time = now whole_frame = b"" for i in range(packet.sequence_total): whole_frame += frames[packet.frame_idx][i] print(f"received frame {packet.frame_idx}") pkt = av.packet.Packet(whole_frame) raw_frame = h264_decoder.decode(pkt)[0].reformat( format="bgra").to_ndarray() raw_frame = np.rot90(raw_frame) raw_frame = np.flipud(raw_frame) raw_frame.shape = (1280, 720, 4) raw_frame[637:643, :] = [0x00, 0x00, 0xFF, 0x00] np.copyto(window_array, raw_frame) window.refresh() f.write(whole_frame) for event in sdl2.ext.get_events(): if event.type == sdl2.SDL_KEYDOWN: if sdl2.SDL_GetKeyName( event.key.keysym.sym).lower() == b'a': res = ChangePacket(0) print("Changed camera to 0") self.sendPacket(res) elif sdl2.SDL_GetKeyName( event.key.keysym.sym).lower() == b'd': res = ChangePacket(1) print("Changed camera to 1") self.sendPacket(res) frames.pop(packet.frame_idx) res = AckPacket(packet.frame_idx, interarrival_time) self.sendPacket(res) elif packet.type == PacketType.RESPONSE: self.previous_packet_time = get_us() elif packet.type == PacketType.FINISH: reactor.stop()
def select_repeat(conn, httpc, num, snd_array): i = 0 ack = 0 seq = 0 num = len(snd_array) window_base = 0 window_width = int(num / 2) window_edge = window_width ack_buffer = [-1] timeout = 5 print(num) print(snd_array) while window_base < num: while i < window_edge: try: p = Packet() if i != 1: p.encode("Data", i, httpc.host, httpc.port, snd_array[i]) conn.sendto(p.to_send(), ("localhost", 3000)) conn.settimeout(timeout) i += 1 except socket.timeout: print("Timeout Expired: " + str(timeout) + "s\n") try: response, sender = conn.recvfrom(1024) p.decode(response) p.prnt() ack = int(p.Payload) if ack_buffer[0] == -1: ack_buffer.pop(0) ack_buffer.append(ack) ack_buffer.sort() except socket.timeout: print("Timeout Expired: " + str(timeout) + "s\n") if window_base not in ack_buffer: j = window_base p.encode("Data", j, httpc.host, httpc.port, snd_array[j]) conn.sendto(p.to_send(), ("localhost", 3000)) conn.settimeout(timeout) while window_base == ack_buffer[0]: if window_base == ack_buffer[0]: if len(ack_buffer) == 1: ack_buffer.pop(0) ack_buffer.append(-1) else: ack_buffer.pop(0) window_base += 1 window_edge = window_base + window_width if window_edge > num: window_edge = num
dropRate = 0 else: dropRate = 100 / int(sys.argv[2]) print 'Random drop chance: ' + sys.argv[2] + '%' elif len(sys.argv) == 2: if int(sys.argv[1]) == 0: dropRate = 0 else: dropRate = 100 / int(sys.argv[1]) print 'Random drop chance: ' + sys.argv[1] + '%' print 'Using Default of localhost' datac, addrc = sockobjc.recvfrom(bufsize) while (datac): packet = Packet.decode(Packet(), datac) packetList.append(packet) if (packet.getPacketType() == "EOT"): for pckt in packetList: if dropRate == 0: if (random.randint(1, dropRate) == 1): print "Packet dropped!" else: sockobjs.sendto(pckt.toString(), (host, ports)) else: sockobjs.sendto(pckt.toString(), (host, ports)) packetList = [] datas, addrs = sockobjs.recvfrom(bufsize) while (datas): ack = Packet.decode(Packet(), datas) ackList.append(ack)
def fin(conn,port,https,data): status = "" timeout = 5 print("BEGINNN") print(data) while status != "PENDING": try: sentence, sender = conn.recvfrom(1024) p = Packet() p.decode(sentence) p.prnt() ack = p.SequenceNumber #port = p.PeerPortNumber if p.PacketType == "Data": data[6] = p.Payload p.encode("ACK",0,"127.0.0.1",port,str(ack)) conn.sendto(p.to_send(), sender) if p.PacketType == "FIN": p.encode("Data",0,"127.0.0.1",port,process(conn,https,"".join(data[len(data)-1]))) conn.sendto(p.to_send(), sender) p.encode("ACK",0,"127.0.0.1",port,"") conn.sendto(p.to_send(), sender) status = "PENDING" print(status + "\n") except socket.timeout: print("ERRR") while status != "TERMINATED": try: p.encode("FIN",0,"127.0.0.1",port,"") conn.sendto(p.to_send(), sender) status = "TERMINATED" print(status + "\n") sentence, sender = conn.recvfrom(1024) p = Packet() p.decode(sentence) p.prnt() except socket.timeout: print("NO ACK\n") return "".join(data[len(data)-1])
def select_repeat(conn,port,num): i = 0 i_w = 0 ack = 0 seq = 0 N = int(ceil(num / 1013)) window_base = 0 window_width = int(N / 2) window_edge = window_width print(N) print(int(N/2)) receive_buffer = [""] * int(N / 2) print(receive_buffer) data = [] timeout = 5 t = 0 while window_base < N: while i < window_edge: try: sentence, sender = conn.recvfrom(1024) p = Packet() p.decode(sentence) p.prnt() ack = p.SequenceNumber #port = p.PeerPortNumber receive_buffer[ack%window_width] = p.Payload p.encode("ACK",seq,"127.0.0.1",port,str(ack)) conn.sendto(p.to_send(), sender) if ack == window_width -1 and '' in receive_buffer: break elif '' not in receive_buffer: break print(i) print(ack) print(receive_buffer) except socket.timeout: print("Timeout Expired in size: " + str(timeout) + "s\n") print(len(receive_buffer)) while receive_buffer[window_base%window_width] != "": data.append(receive_buffer[window_base%window_width]) receive_buffer[window_base%window_width] = "" window_base += 1 window_edge = window_base + window_width print(window_edge) print("INSSISIFIJSDIOFJDZLF") if window_edge > N: window_edge = N print(window_base) print(window_edge) return data
sockobj.bind(("", port)) print("Server") print("waiting on port:", port) f = open("hello1.txt", 'wb') if len(sys.argv) == 2: host = sys.argv[1] else: print 'Using Default of localhost' data, addr = sockobj.recvfrom(bufsize) while (data): packet = Packet.decode(Packet(), data) print 'Received Packet Type: ' + str(packet.getPacketType()) + ", Sequence Number: " + str(packet.getSeqNum()) packetList.append(packet) f.write(packet.getData()) if (packet.getPacketType() == "EOT"): for pckt in packetList: ack = Packet("ACK", 1, "", pckt.getSeqNum()) ackStr = ack.toString() sockobj.sendto(ackStr, addr) print 'Sent Packet Type: ' + str(ack.getPacketType()) + ", Acknowledgement Number: " + str(ack.getAckNum()) packetList = [] sockobj.sendto("EOT", addr) data, addr = sockobj.recvfrom(bufsize) f.close()
def main(args): # Check arguments are valid try: in_port = int(args[1]) out_port = int(args[2]) channel_in_port = int(args[3]) filename = args[4] except: print("Usage: {} <in_port> <out_port> <channel_in_port> <filename>". format(args[0])) # Check that ports are in the valid range for port in [in_port, out_port, channel_in_port]: if port < 1024 or port > 64000: print( "All port numbers should be integers in the range [1024, 64000]." ) return # Create sockets (and connect socket_out) socket_in = create_listening_socket(in_port) socket_out = create_sending_socket(out_port, channel_in_port) if None in [socket_in, socket_out]: sys.exit("One of the sockets failed to be created.") # Check if file exists if os.path.isfile(filename): sys.exit("Error: {} already exists.".format(filename)) # Initialisation expected = 0 file = open(filename, 'wb') input( "Please acknowledge on the channel that you have started the receiver, then press enter." ) # Accept connection from channel socket_in, addr = socket_in.accept() print("Receiving data...") # Main loop i = 0 while True: readable, _, _ = select.select([socket_in], [], []) # got a response print("Got packet {}".format(i), end='\r') i += 1 s = readable[0] data = s.recv(1024) rcvd = Packet() rcvd.decode(data) if rcvd.is_valid_data(): # got a valid data packet # Prepare an acknowledgement packet and send it magic_no = MAGIC_NO packet_type = PTYPE_ACK seq_no = rcvd.seq_no data_len = 0 data = b"" pack = Packet(magic_no, packet_type, seq_no, data_len, data) socket_out.send(pack.encode()) if rcvd.seq_no == expected: expected = 1 - expected if rcvd.data_len > 0: # has some data file.write(rcvd.data) else: # no data - indicates end of file file.close() socket_in.shutdown(socket.SHUT_RDWR) socket_in.close() socket_out.shutdown(socket.SHUT_RDWR) socket_out.close() print("\nData received.") return