diff options
Diffstat (limited to 'user_client.c')
-rw-r--r-- | user_client.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/user_client.c b/user_client.c new file mode 100644 index 0000000..68c79af --- /dev/null +++ b/user_client.c @@ -0,0 +1,85 @@ +// udp client driver program +#include <arpa/inet.h> +#include <netinet/in.h> +#include <stdio.h> +#include <stdlib.h> +#include <strings.h> +#include <sys/socket.h> +#include <sys/time.h> +#include <sys/types.h> +#include <unistd.h> + +#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); +} |