Loading examples/receiver.py +4 −3 Original line number Diff line number Diff line Loading @@ -3,11 +3,12 @@ import prrt port = int(sys.argv[1]) s = prrt.PrrtSocket(port=port, isSender=False) s = prrt.PrrtSocket(port=port) while True: d = s.recv() d, addr = s.recv() d = d.decode("utf8") if d != "Close": print d print(d, addr) else: break examples/sender.py +4 −3 Original line number Diff line number Diff line Loading @@ -3,10 +3,11 @@ import prrt host = sys.argv[1] port = int(sys.argv[2]) localport = int(sys.argv[3]) s = prrt.PrrtSocket(port=port, isSender=True) s = prrt.PrrtSocket(port=localport) s.connect(host, port) for i in range(10): s.send("Packet {}".format(i)) s.send("Close") s.send("Packet {}".format(i).encode("utf8")) s.send("Close".encode("utf8")) prrt/cprrt.pxd +13 −7 Original line number Diff line number Diff line include "posix/time.pxd" include "sockets.pxd" from libc.stdint cimport uint32_t, uint16_t, uint8_t, int32_t from libc.string cimport const_char cdef extern from "pthread.h" nogil: ctypedef struct pthread_t: pass Loading Loading @@ -123,14 +125,14 @@ cdef extern from "proto/socket.h": int PrrtSocket_connect(PrrtSocket *sock_ptr, const_char *host, const uint16_t port) int PrrtSocket_send(PrrtSocket *sock_ptr, const uint8_t *data, const size_t data_len) int32_t PrrtSocket_recv(PrrtSocket *sock_ptr, void *buf_ptr) nogil int32_t PrrtSocket_receive_asap(PrrtSocket *s, void *buf_ptr) nogil int32_t PrrtSocket_receive_asap_wait(PrrtSocket *s, void *buf_ptr) nogil int32_t PrrtSocket_receive_asap_timedwait(PrrtSocket *s, void *buf_ptr, timespec* deadline) nogil int32_t PrrtSocket_recv(PrrtSocket *sock_ptr, void *buf_ptr, sockaddr* addr) nogil int32_t PrrtSocket_receive_asap(PrrtSocket *s, void *buf_ptr, sockaddr* addr) nogil int32_t PrrtSocket_receive_asap_wait(PrrtSocket *s, void *buf_ptr, sockaddr* addr) nogil int32_t PrrtSocket_receive_asap_timedwait(PrrtSocket *s, void *buf_ptr, sockaddr* addr, timespec* deadline) nogil int32_t PrrtSocket_receive_ordered(PrrtSocket *s, void *buf_ptr, prrtTimedelta_t time_window_us) nogil int32_t PrrtSocket_receive_ordered_wait(PrrtSocket *s, void *buf_ptr, prrtTimedelta_t time_window_us) nogil int32_t PrrtSocket_receive_ordered_timedwait(PrrtSocket *s, void *buf_ptr, prrtTimedelta_t time_window_us, timespec* deadline) nogil int32_t PrrtSocket_receive_ordered(PrrtSocket *s, void *buf_ptr, sockaddr* addr, prrtTimedelta_t time_window_us) nogil int32_t PrrtSocket_receive_ordered_wait(PrrtSocket *s, void *buf_ptr, sockaddr* addr, prrtTimedelta_t time_window_us) nogil int32_t PrrtSocket_receive_ordered_timedwait(PrrtSocket *s, void *buf_ptr, sockaddr* addr, prrtTimedelta_t time_window_us, timespec* deadline) nogil bint PrrtSocket_set_sock_opt(PrrtSocket *sock_ptr, const_char *name, const uint32_t value) uint32_t PrrtSocket_get_sock_opt(PrrtSocket *sock_ptr, const_char *name) Loading @@ -149,6 +151,9 @@ cdef extern from "proto/socket.h": bint PrrtSocket_get_app_limited(PrrtSocket *socket) bint PrrtSocket_enable_thread_pinning(PrrtSocket *socket) char *PrrtSocket_inet_ntoa(in_addr*) uint16_t PrrtSocket_ntohs(uint16_t v) cdef extern from "proto/stores/packetDeliveryStore.h": ctypedef struct PrrtPacketDeliveryStore: pass Loading @@ -171,3 +176,4 @@ cdef extern from "util/pipe.h": cdef extern from "util/mpsc_queue.h": ctypedef struct MPSCQueue: pass prrt/proto/processes/dataReceiver.c +1 −0 Original line number Diff line number Diff line Loading @@ -303,6 +303,7 @@ void *receive_data_loop(void *ptr) { XlapTimeStampCycle(&tsph3, ts_any_packet, 0, DecodeEnd); prrtSequenceNumber_t seqno = packet->sequenceNumber; prrtTimestamp_t prrt_recv_timestamp = PrrtClock_TimespecToPrrtTimestamp(packet_recv_timestamp); memcpy(&packet->sender_addr, &remote, addrlen); prrtPacketType_t packetType = PrrtPacket_type(packet); debug(DEBUG_DATARECEIVER, "received packet %d:%u", (int) packetType, seqno); Loading prrt/proto/socket.c +26 −16 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ #include "types/packetTimeout.h" #include "socket.h" static inline prrtPacketLength_t deliver_packet(const PrrtSocket *s, void *buffer, PrrtPacket *packet) { static inline prrtPacketLength_t deliver_packet(const PrrtSocket *s, void *buffer, PrrtPacket *packet, struct sockaddr* addr) { prrtPacketLength_t len = 0; if(packet != NULL) { XlapTimeStampClock(s, ts_data_packet, packet->sequenceNumber, PrrtReceivePackage); Loading @@ -29,6 +29,8 @@ static inline prrtPacketLength_t deliver_packet(const PrrtSocket *s, void *buffe PrrtPacket_copy_payload_to_buffer(buffer, packet, PRRT_PACKET_DATA_HEADER_SIZE); XlapTimeStampCycle(s, ts_data_packet, packet->sequenceNumber, CopyOutputEnd); memcpy(addr, &(packet->sender_addr), sizeof(struct sockaddr_in)); XlapTimeStampClock(s, ts_data_packet, packet->sequenceNumber, PrrtDeliver); XlapTimeStampCycle(s, ts_data_packet, packet->sequenceNumber, PrrtDeliver); PrrtPacket_destroy(packet); Loading Loading @@ -238,13 +240,13 @@ bool PrrtSocket_closing(PrrtSocket *s) { return atomic_load_explicit(&s->closing, memory_order_acquire); } int32_t PrrtSocket_receive_asap(PrrtSocket *s, void *buf_ptr) { int32_t PrrtSocket_receive_asap(PrrtSocket *s, void *buf_ptr, struct sockaddr* addr) { PrrtPacket *packet; packet = PrrtPacketDeliveryStore_get_packet(s->packetDeliveryStore, 0, MAX_TIMESTAMP); return deliver_packet(s, buf_ptr, packet); return deliver_packet(s, buf_ptr, packet, addr); } int32_t PrrtSocket_receive_asap_wait(PrrtSocket *s, void *buf_ptr) { int32_t PrrtSocket_receive_asap_wait(PrrtSocket *s, void *buf_ptr, struct sockaddr* addr) { PrrtPacket *packet; do { packet = PrrtPacketDeliveryStore_get_packet_wait(s->packetDeliveryStore, 0, MAX_TIMESTAMP); Loading @@ -253,30 +255,30 @@ int32_t PrrtSocket_receive_asap_wait(PrrtSocket *s, void *buf_ptr) { } } while (!packet); return deliver_packet(s, buf_ptr, packet); return deliver_packet(s, buf_ptr, packet, addr); } int32_t PrrtSocket_receive_asap_timedwait(PrrtSocket *s, void *buf_ptr, struct timespec* deadline) { int32_t PrrtSocket_receive_asap_timedwait(PrrtSocket *s, void *buf_ptr, struct sockaddr* addr, struct timespec* deadline) { PrrtPacket *packet = PrrtPacketDeliveryStore_get_packet_timedwait(s->packetDeliveryStore, 0, MAX_TIMESTAMP, deadline); if (packet == NULL && errno == ETIMEDOUT) { return -1 * ETIMEDOUT; } return deliver_packet(s, buf_ptr, packet); return deliver_packet(s, buf_ptr, packet, addr); } int32_t PrrtSocket_recv(PrrtSocket *s, void *buf_ptr) { return PrrtSocket_receive_asap_wait(s, buf_ptr); int32_t PrrtSocket_recv(PrrtSocket *s, void *buf_ptr, struct sockaddr* addr) { return PrrtSocket_receive_asap_wait(s, buf_ptr, addr); } int32_t PrrtSocket_receive_ordered(PrrtSocket *s, void *buf_ptr, prrtTimedelta_t time_window_us) { int32_t PrrtSocket_receive_ordered(PrrtSocket *s, void *buf_ptr, struct sockaddr* addr, prrtTimedelta_t time_window_us) { prrtTimestamp_t now = PrrtClock_get_current_time_us(); PrrtPacket *packet = PrrtPacketDeliveryStore_get_packet(s->packetDeliveryStore, now - time_window_us, now + time_window_us); return deliver_packet(s, buf_ptr, packet); return deliver_packet(s, buf_ptr, packet, addr); } int32_t PrrtSocket_receive_ordered_wait(PrrtSocket *s, void *buf_ptr, prrtTimedelta_t time_window_us) { int32_t PrrtSocket_receive_ordered_wait(PrrtSocket *s, void *buf_ptr, struct sockaddr* addr, prrtTimedelta_t time_window_us) { PrrtPacket *packet; do { prrtTimestamp_t now = PrrtClock_get_current_time_us(); Loading @@ -287,10 +289,10 @@ int32_t PrrtSocket_receive_ordered_wait(PrrtSocket *s, void *buf_ptr, prrtTimede } } while (!packet); return deliver_packet(s, buf_ptr, packet); return deliver_packet(s, buf_ptr, packet, addr); } int32_t PrrtSocket_receive_ordered_timedwait(PrrtSocket *s, void *buf_ptr, prrtTimedelta_t time_window_us, struct timespec* deadline) { int32_t PrrtSocket_receive_ordered_timedwait(PrrtSocket *s, void *buf_ptr, struct sockaddr* addr, prrtTimedelta_t time_window_us, struct timespec* deadline) { prrtTimestamp_t now = PrrtClock_get_current_time_us(); PrrtPacket *packet = PrrtPacketDeliveryStore_get_packet_timedwait(s->packetDeliveryStore, now - time_window_us, Loading @@ -299,7 +301,7 @@ int32_t PrrtSocket_receive_ordered_timedwait(PrrtSocket *s, void *buf_ptr, prrtT return -1 * ETIMEDOUT; } return deliver_packet(s, buf_ptr, packet); return deliver_packet(s, buf_ptr, packet, addr); } Loading Loading @@ -543,3 +545,11 @@ PrrtCoder *PrrtSocket_get_matching_coder(PrrtSocket *s, PrrtCodingConfiguration } return PrrtCoder_copy(s->coder); }; char *PrrtSocket_inet_ntoa(struct in_addr* in) { return inet_ntoa(*in); } uint16_t PrrtSocket_ntohs(uint16_t v) { return ntohs(v); } No newline at end of file Loading
examples/receiver.py +4 −3 Original line number Diff line number Diff line Loading @@ -3,11 +3,12 @@ import prrt port = int(sys.argv[1]) s = prrt.PrrtSocket(port=port, isSender=False) s = prrt.PrrtSocket(port=port) while True: d = s.recv() d, addr = s.recv() d = d.decode("utf8") if d != "Close": print d print(d, addr) else: break
examples/sender.py +4 −3 Original line number Diff line number Diff line Loading @@ -3,10 +3,11 @@ import prrt host = sys.argv[1] port = int(sys.argv[2]) localport = int(sys.argv[3]) s = prrt.PrrtSocket(port=port, isSender=True) s = prrt.PrrtSocket(port=localport) s.connect(host, port) for i in range(10): s.send("Packet {}".format(i)) s.send("Close") s.send("Packet {}".format(i).encode("utf8")) s.send("Close".encode("utf8"))
prrt/cprrt.pxd +13 −7 Original line number Diff line number Diff line include "posix/time.pxd" include "sockets.pxd" from libc.stdint cimport uint32_t, uint16_t, uint8_t, int32_t from libc.string cimport const_char cdef extern from "pthread.h" nogil: ctypedef struct pthread_t: pass Loading Loading @@ -123,14 +125,14 @@ cdef extern from "proto/socket.h": int PrrtSocket_connect(PrrtSocket *sock_ptr, const_char *host, const uint16_t port) int PrrtSocket_send(PrrtSocket *sock_ptr, const uint8_t *data, const size_t data_len) int32_t PrrtSocket_recv(PrrtSocket *sock_ptr, void *buf_ptr) nogil int32_t PrrtSocket_receive_asap(PrrtSocket *s, void *buf_ptr) nogil int32_t PrrtSocket_receive_asap_wait(PrrtSocket *s, void *buf_ptr) nogil int32_t PrrtSocket_receive_asap_timedwait(PrrtSocket *s, void *buf_ptr, timespec* deadline) nogil int32_t PrrtSocket_recv(PrrtSocket *sock_ptr, void *buf_ptr, sockaddr* addr) nogil int32_t PrrtSocket_receive_asap(PrrtSocket *s, void *buf_ptr, sockaddr* addr) nogil int32_t PrrtSocket_receive_asap_wait(PrrtSocket *s, void *buf_ptr, sockaddr* addr) nogil int32_t PrrtSocket_receive_asap_timedwait(PrrtSocket *s, void *buf_ptr, sockaddr* addr, timespec* deadline) nogil int32_t PrrtSocket_receive_ordered(PrrtSocket *s, void *buf_ptr, prrtTimedelta_t time_window_us) nogil int32_t PrrtSocket_receive_ordered_wait(PrrtSocket *s, void *buf_ptr, prrtTimedelta_t time_window_us) nogil int32_t PrrtSocket_receive_ordered_timedwait(PrrtSocket *s, void *buf_ptr, prrtTimedelta_t time_window_us, timespec* deadline) nogil int32_t PrrtSocket_receive_ordered(PrrtSocket *s, void *buf_ptr, sockaddr* addr, prrtTimedelta_t time_window_us) nogil int32_t PrrtSocket_receive_ordered_wait(PrrtSocket *s, void *buf_ptr, sockaddr* addr, prrtTimedelta_t time_window_us) nogil int32_t PrrtSocket_receive_ordered_timedwait(PrrtSocket *s, void *buf_ptr, sockaddr* addr, prrtTimedelta_t time_window_us, timespec* deadline) nogil bint PrrtSocket_set_sock_opt(PrrtSocket *sock_ptr, const_char *name, const uint32_t value) uint32_t PrrtSocket_get_sock_opt(PrrtSocket *sock_ptr, const_char *name) Loading @@ -149,6 +151,9 @@ cdef extern from "proto/socket.h": bint PrrtSocket_get_app_limited(PrrtSocket *socket) bint PrrtSocket_enable_thread_pinning(PrrtSocket *socket) char *PrrtSocket_inet_ntoa(in_addr*) uint16_t PrrtSocket_ntohs(uint16_t v) cdef extern from "proto/stores/packetDeliveryStore.h": ctypedef struct PrrtPacketDeliveryStore: pass Loading @@ -171,3 +176,4 @@ cdef extern from "util/pipe.h": cdef extern from "util/mpsc_queue.h": ctypedef struct MPSCQueue: pass
prrt/proto/processes/dataReceiver.c +1 −0 Original line number Diff line number Diff line Loading @@ -303,6 +303,7 @@ void *receive_data_loop(void *ptr) { XlapTimeStampCycle(&tsph3, ts_any_packet, 0, DecodeEnd); prrtSequenceNumber_t seqno = packet->sequenceNumber; prrtTimestamp_t prrt_recv_timestamp = PrrtClock_TimespecToPrrtTimestamp(packet_recv_timestamp); memcpy(&packet->sender_addr, &remote, addrlen); prrtPacketType_t packetType = PrrtPacket_type(packet); debug(DEBUG_DATARECEIVER, "received packet %d:%u", (int) packetType, seqno); Loading
prrt/proto/socket.c +26 −16 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ #include "types/packetTimeout.h" #include "socket.h" static inline prrtPacketLength_t deliver_packet(const PrrtSocket *s, void *buffer, PrrtPacket *packet) { static inline prrtPacketLength_t deliver_packet(const PrrtSocket *s, void *buffer, PrrtPacket *packet, struct sockaddr* addr) { prrtPacketLength_t len = 0; if(packet != NULL) { XlapTimeStampClock(s, ts_data_packet, packet->sequenceNumber, PrrtReceivePackage); Loading @@ -29,6 +29,8 @@ static inline prrtPacketLength_t deliver_packet(const PrrtSocket *s, void *buffe PrrtPacket_copy_payload_to_buffer(buffer, packet, PRRT_PACKET_DATA_HEADER_SIZE); XlapTimeStampCycle(s, ts_data_packet, packet->sequenceNumber, CopyOutputEnd); memcpy(addr, &(packet->sender_addr), sizeof(struct sockaddr_in)); XlapTimeStampClock(s, ts_data_packet, packet->sequenceNumber, PrrtDeliver); XlapTimeStampCycle(s, ts_data_packet, packet->sequenceNumber, PrrtDeliver); PrrtPacket_destroy(packet); Loading Loading @@ -238,13 +240,13 @@ bool PrrtSocket_closing(PrrtSocket *s) { return atomic_load_explicit(&s->closing, memory_order_acquire); } int32_t PrrtSocket_receive_asap(PrrtSocket *s, void *buf_ptr) { int32_t PrrtSocket_receive_asap(PrrtSocket *s, void *buf_ptr, struct sockaddr* addr) { PrrtPacket *packet; packet = PrrtPacketDeliveryStore_get_packet(s->packetDeliveryStore, 0, MAX_TIMESTAMP); return deliver_packet(s, buf_ptr, packet); return deliver_packet(s, buf_ptr, packet, addr); } int32_t PrrtSocket_receive_asap_wait(PrrtSocket *s, void *buf_ptr) { int32_t PrrtSocket_receive_asap_wait(PrrtSocket *s, void *buf_ptr, struct sockaddr* addr) { PrrtPacket *packet; do { packet = PrrtPacketDeliveryStore_get_packet_wait(s->packetDeliveryStore, 0, MAX_TIMESTAMP); Loading @@ -253,30 +255,30 @@ int32_t PrrtSocket_receive_asap_wait(PrrtSocket *s, void *buf_ptr) { } } while (!packet); return deliver_packet(s, buf_ptr, packet); return deliver_packet(s, buf_ptr, packet, addr); } int32_t PrrtSocket_receive_asap_timedwait(PrrtSocket *s, void *buf_ptr, struct timespec* deadline) { int32_t PrrtSocket_receive_asap_timedwait(PrrtSocket *s, void *buf_ptr, struct sockaddr* addr, struct timespec* deadline) { PrrtPacket *packet = PrrtPacketDeliveryStore_get_packet_timedwait(s->packetDeliveryStore, 0, MAX_TIMESTAMP, deadline); if (packet == NULL && errno == ETIMEDOUT) { return -1 * ETIMEDOUT; } return deliver_packet(s, buf_ptr, packet); return deliver_packet(s, buf_ptr, packet, addr); } int32_t PrrtSocket_recv(PrrtSocket *s, void *buf_ptr) { return PrrtSocket_receive_asap_wait(s, buf_ptr); int32_t PrrtSocket_recv(PrrtSocket *s, void *buf_ptr, struct sockaddr* addr) { return PrrtSocket_receive_asap_wait(s, buf_ptr, addr); } int32_t PrrtSocket_receive_ordered(PrrtSocket *s, void *buf_ptr, prrtTimedelta_t time_window_us) { int32_t PrrtSocket_receive_ordered(PrrtSocket *s, void *buf_ptr, struct sockaddr* addr, prrtTimedelta_t time_window_us) { prrtTimestamp_t now = PrrtClock_get_current_time_us(); PrrtPacket *packet = PrrtPacketDeliveryStore_get_packet(s->packetDeliveryStore, now - time_window_us, now + time_window_us); return deliver_packet(s, buf_ptr, packet); return deliver_packet(s, buf_ptr, packet, addr); } int32_t PrrtSocket_receive_ordered_wait(PrrtSocket *s, void *buf_ptr, prrtTimedelta_t time_window_us) { int32_t PrrtSocket_receive_ordered_wait(PrrtSocket *s, void *buf_ptr, struct sockaddr* addr, prrtTimedelta_t time_window_us) { PrrtPacket *packet; do { prrtTimestamp_t now = PrrtClock_get_current_time_us(); Loading @@ -287,10 +289,10 @@ int32_t PrrtSocket_receive_ordered_wait(PrrtSocket *s, void *buf_ptr, prrtTimede } } while (!packet); return deliver_packet(s, buf_ptr, packet); return deliver_packet(s, buf_ptr, packet, addr); } int32_t PrrtSocket_receive_ordered_timedwait(PrrtSocket *s, void *buf_ptr, prrtTimedelta_t time_window_us, struct timespec* deadline) { int32_t PrrtSocket_receive_ordered_timedwait(PrrtSocket *s, void *buf_ptr, struct sockaddr* addr, prrtTimedelta_t time_window_us, struct timespec* deadline) { prrtTimestamp_t now = PrrtClock_get_current_time_us(); PrrtPacket *packet = PrrtPacketDeliveryStore_get_packet_timedwait(s->packetDeliveryStore, now - time_window_us, Loading @@ -299,7 +301,7 @@ int32_t PrrtSocket_receive_ordered_timedwait(PrrtSocket *s, void *buf_ptr, prrtT return -1 * ETIMEDOUT; } return deliver_packet(s, buf_ptr, packet); return deliver_packet(s, buf_ptr, packet, addr); } Loading Loading @@ -543,3 +545,11 @@ PrrtCoder *PrrtSocket_get_matching_coder(PrrtSocket *s, PrrtCodingConfiguration } return PrrtCoder_copy(s->coder); }; char *PrrtSocket_inet_ntoa(struct in_addr* in) { return inet_ntoa(*in); } uint16_t PrrtSocket_ntohs(uint16_t v) { return ntohs(v); } No newline at end of file