From 4faf778b6ec4b9d8ab0c19e22d27c76f4c67ab28 Mon Sep 17 00:00:00 2001 From: Oxore Date: Thu, 14 Dec 2023 23:08:02 +0300 Subject: Impl mutual exchange of UDP messages --- client.c | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) (limited to 'client.c') diff --git a/client.c b/client.c index 007bf2d..8f4d5ff 100644 --- a/client.c +++ b/client.c @@ -3,17 +3,21 @@ #include #include #include +#include #include #include #include #include #include +static unsigned char udp_buffer[UINT16_MAX]; + static inline bool IsDigit(char c) { return c >= '0' && c <= '9'; } -static unsigned ParseAddress(char const *str, FILE *log_stream) +static uint32_t ParseAddress(char const *str, FILE *log_stream) { - unsigned addr = 0, byte_counter = 0, byte = 0, digits_counter = 0; + uint32_t addr = 0; + unsigned byte_counter = 0, byte = 0, digits_counter = 0; for (size_t i = 0;; i++) { char const c = str[i]; if (c == '\0') { @@ -74,7 +78,7 @@ int main(int const argc, char *const argv[]) } int const port = atoi(argv[2]); if (port <= 0 || port > UINT16_MAX) { - fprintf(stderr, "Invalid port specifed\n"); + fprintf(stderr, "Invalid port specified\n"); return 1; } int const fd = socket(AF_INET, SOCK_DGRAM, 0); @@ -87,14 +91,29 @@ int main(int const argc, char *const argv[]) .sin_port = htons(port), .sin_addr.s_addr = htonl(addr), }; - for (int i = 0; i < 4; i++) { - ssize_t const ret = sendto( - fd, "hello", 5, 0, (struct sockaddr const *)&serveraddr, sizeof(serveraddr)); - if (ret < 0) { - perror("sendto failed"); - break; - } - printf("message sent\n"); + ssize_t const ret = sendto( + fd, "\x2a", 1, 0, (struct sockaddr const *)&serveraddr, sizeof(serveraddr)); + if (ret < 0) { + perror("sendto failed"); + return 1; } + printf("message sent\n"); + struct sockaddr_in source_address; + socklen_t source_address_len = sizeof(source_address); + int const length = recvfrom( + fd, + udp_buffer, + sizeof(udp_buffer) - 1, + 0, + (struct sockaddr*)&source_address, + &source_address_len); + (void) length; + uint32_t const addr2 = ntohl(source_address.sin_addr.s_addr); + uint8_t const a0 = addr2 >> 24; + uint8_t const a1 = addr2 >> 16; + uint8_t const a2 = addr2 >> 8; + uint8_t const a3 = addr2; + uint16_t const port2 = ntohs(source_address.sin_port); + printf("Received: %u from %u.%u.%u.%u:%u\n", udp_buffer[0], a0, a1, a2, a3, port2); close(fd); } -- cgit v1.2.3