// udp client driver program #include #include #include #include #include #include #include #include #include #include "common.h" static const unsigned char payload_request[] = { PAYLOAD_REQUEST, 0xFF}; struct { unsigned long long int send_start; unsigned long long int received_end; } timings[MAX_UDP_PACKETS]; static int set_ts(unsigned long long int * const out) { struct timeval tv = {}; if (gettimeofday(&tv, NULL) != 0) return 1; *out = (tv.tv_sec * 1000 * 1000) + tv.tv_usec; return 0; } int main() { char buffer[BUFSIZ]; int sockfd; struct sockaddr_in servaddr = {}; servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); servaddr.sin_port = htons(UDP_PORT); servaddr.sin_family = AF_INET; sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("udp socket"); return 1; } if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { perror("udp connect"); return 1; } size_t i; ssize_t n; for (i = 0; i < MAX_UDP_PACKETS; ++i) { if (set_ts(&timings[i].send_start) != 0) { n = -1; break; } n = sendto(sockfd, payload_request, sizeof(payload_request), 0, NULL, 0); if (n < 0) { perror("udp sendto"); break; } n = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)NULL, NULL); if (n < 0) { perror("udp recvfrom"); break; } if (set_ts(&timings[i].received_end) != 0) { n = -1; break; } } close(sockfd); printf("# packet_number rtt\n"); for (size_t i = 0; i < MAX_UDP_PACKETS; ++i) { printf("%zu %lld\n", i, timings[i].received_end - timings[i].send_start); } return !(i == MAX_UDP_PACKETS); }