Example #1
0
def read(receiver):
    received = []
    max_index = -1
    stream_id = get_stream_id(receiver)
    total_len = get_stream_length(stream_id, receiver)

    while len(received) != total_len:
        try:
            raw_payload, addr = receiver.recvfrom(1024)
            packet = get_packet(raw_payload)
            index = packet["index"]

            if packet["stream_id"] == stream_id and packet[
                    "type"] == "DATA" and is_valid(
                        raw_payload) and random.random() > 0.3:
                receiver.sendto(
                    make_payload(stream_id, "CONTROL", "ACK", index), addr)
                if index > max_index:
                    max_index = index

                if not is_index_in_chunks(received, index):
                    received.append((packet["data"], index))
            else:
                receiver.sendto(
                    make_payload(stream_id, "CONTROL", "NACK", index), addr)
        except:
            for i in range(max_index + 1):
                if not is_index_in_chunks(received, i):
                    receiver.sendto(
                        make_payload(stream_id, "CONTROL", "NACK", i), addr)

    return join_chunks(received)
Example #2
0
def init_write(stream_id, sender, receiver):
    sender.sendto(make_payload(stream_id, "INIT", stream_id, 0), receiver)
    while True:
        try:
            resp, addr = sender.recvfrom(1024)
            packet = get_packet(resp)
            if packet["type"] == "INIT" and packet["data"] == "ACK":
                break
        except:
            sender.sendto(make_payload(stream_id, "INIT", stream_id, 0),
                          receiver)
            continue
Example #3
0
def init_stream_len(stream_id, length, sender, receiver):
    sender.sendto(make_payload(stream_id, "LENGTH", str(length), 0), receiver)

    while True:
        try:
            resp, addr = sender.recvfrom(1024)
            packet = get_packet(resp)
            if packet["type"] == "LENGTH" and packet["data"] == "ACK":
                break
        except:
            sender.sendto(
                make_payload(stream_id, "LENGTH", str(len(data2send)), 0),
                receiver)
            continue
Example #4
0
def get_stream_length(stream_id, receiver):
    while True:
        with suppress(BlockingIOError):
            payload, addrs = receiver.recvfrom(1024)
            packet = get_packet(payload)
            if is_valid(payload) and packet["type"] == "LENGTH":
                receiver.sendto(make_payload(stream_id, "LENGTH", "ACK", 0),
                                addrs)

                return int(packet["data"])
Example #5
0
def get_stream_id(receiver):
    while True:
        with suppress(BlockingIOError):
            payload, addrs = receiver.recvfrom(1024)
            packet = get_packet(payload)

            if is_valid(payload) and packet["type"] == "INIT":
                stream_id = packet["data"]
                receiver.sendto(make_payload(stream_id, "INIT", "ACK", 0),
                                addrs)

                return stream_id
Example #6
0
def create_packets(msgs, stream_id):
    res = []
    for i, chunk in enumerate(msgs):
        res.append(make_payload(stream_id, "DATA", chunk, i))

    return res