コード例 #1
0
ファイル: sender.py プロジェクト: olliechick/sockets
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
コード例 #2
0
ファイル: server.py プロジェクト: nukush/frc-usb-camera
    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.
コード例 #3
0
ファイル: daemon.py プロジェクト: umbc-hackafe/x10-controller
 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
コード例 #4
0
    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))
コード例 #5
0
    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))
コード例 #6
0
ファイル: client.py プロジェクト: max01mald/Python_WebSocket
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")
コード例 #7
0
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
コード例 #8
0
ファイル: client.py プロジェクト: max01mald/Python_WebSocket
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
コード例 #9
0
ファイル: channel.py プロジェクト: olliechick/sockets
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
コード例 #10
0
ファイル: client.py プロジェクト: max01mald/Python_WebSocket
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")
コード例 #11
0
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
コード例 #12
0
ファイル: client.py プロジェクト: nukush/frc-usb-camera
    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()
コード例 #13
0
ファイル: client.py プロジェクト: max01mald/Python_WebSocket
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
コード例 #14
0
ファイル: udpn.py プロジェクト: Piyotr-K/NetworkSimulator
        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)
コード例 #15
0
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])
コード例 #16
0
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
コード例 #17
0
ファイル: udps.py プロジェクト: Piyotr-K/NetworkSimulator
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()
コード例 #18
0
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