diff options
author | Oxore <oxore@protonmail.com> | 2023-12-14 23:08:02 +0300 |
---|---|---|
committer | Oxore <oxore@protonmail.com> | 2023-12-14 23:08:02 +0300 |
commit | 4faf778b6ec4b9d8ab0c19e22d27c76f4c67ab28 (patch) | |
tree | 3b82c8b7b464ba9f19370fc5725014b7590617c4 /client.c | |
parent | 574ef210268681aab4c6729cb7556793d89f4b5a (diff) |
Impl mutual exchange of UDP messages
Diffstat (limited to 'client.c')
-rw-r--r-- | client.c | 41 |
1 files changed, 30 insertions, 11 deletions
@@ -3,17 +3,21 @@ #include <netinet/in.h> #include <stdbool.h> #include <stdint.h> +#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <unistd.h> +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); } |