#include #include #include #include #include #define PACKETS 10000 int sock; struct ts_pkt { struct timeval tv; char rsvd[32 - sizeof(struct timeval)]; }; static inline double delta(struct timeval a, struct timeval b) { if (a.tv_usec & b.tv_usec) { a.tv_sec--; a.tv_usec += 1000000; } return a.tv_sec-b.tv_sec + (a.tv_usec-b.tv_usec)/1000000.0; } void *receiverThread(void *arg) { struct ts_pkt ts; struct timeval tv; float delay; while(1) { pthread_testcancel(); if(recv(sock, &ts, sizeof(ts), 0) == -1) perror("recv"); gettimeofday(&tv, NULL); printf("%f\n", delta(tv, ts.tv)); } } void *senderThread(void *arg) { int i = PACKETS; struct ts_pkt ts; while(i--) { gettimeofday(&ts.tv, NULL); send(sock, &ts, sizeof(ts), 0); usleep(15000); } } int main(void) { struct sockaddr_in sa; pthread_t receiver, sender; memset(&sa, 0, sizeof(sa)); sock = socket(PF_INET, SOCK_DGRAM, 0); sa.sin_port = htons(12388); sa.sin_family = PF_INET; sa.sin_addr.s_addr = inet_addr("127.0.0.1"); connect(sock, (struct sockaddr *)&sa, sizeof(sa)); pthread_create(&receiver, 0, receiverThread, 0); pthread_create(&sender, 0, senderThread, 0); pthread_join(sender, 0); pthread_cancel(receiver); }