From b253481005f53280a295453d0cc23c6fcd12a113 Mon Sep 17 00:00:00 2001 From: Mitya Selivanov Date: Mon, 12 Aug 2024 19:12:29 +0200 Subject: Fix UDP sockets --- examples/echo | Bin 300296 -> 0 bytes examples/echo.c | 58 +++++++++++++++++++------------------------------------- 2 files changed, 20 insertions(+), 38 deletions(-) delete mode 100755 examples/echo (limited to 'examples') diff --git a/examples/echo b/examples/echo deleted file mode 100755 index 3a4640f..0000000 Binary files a/examples/echo and /dev/null differ diff --git a/examples/echo.c b/examples/echo.c index 4eb5c3e..9c1b71e 100755 --- a/examples/echo.c +++ b/examples/echo.c @@ -253,49 +253,25 @@ i32 main(i32 argc, c8 **argv) { NULL ); + if (strcmp(buf, "!kill") == 0) + break; + if (n > 0) { buf[n] = '\0'; printf("%s\n", buf); - } - - p_sleep_for(1000); + } else + p_sleep_for(10); } } break; case MODE_SEND: { printf("Sending UDP messages to 127.0.0.1 on port %d\nEnter a message or !quit\n\n> ", PORT); - p_send( - 0, - (IP_Address) { - .protocol = IPv4_UDP, - .port = PORT, - .v4_address = { 127, 0, 0, 1 }, - }, - sizeof "" - 1, - (u8 *) "", - NULL - ); - for (;;) { - p_send( - 0, - (IP_Address) { - .protocol = IPv4_UDP, - .port = PORT, - .v4_address = { 127, 0, 0, 1 }, - }, - sizeof "" - 1, - (u8 *) "", - NULL - ); - - if (fgets(buf, sizeof buf, stdin) == NULL) { - printf("errno %d\n", errno); + if (scanf("%s", buf) == 0) continue; - } - if (strcmp(buf, "!quit\n") == 0) + if (strcmp(buf, "!quit") == 0) break; p_send( @@ -305,7 +281,7 @@ i32 main(i32 argc, c8 **argv) { .port = PORT, .v4_address = { 127, 0, 0, 1 }, }, - strlen(buf) - 1, + strlen(buf), (u8 *) buf, NULL ); @@ -466,6 +442,7 @@ void p_sleep_for(i64 duration) { #include typedef struct { + b8 ready; i32 socket; u16 local_port; IP_Address address; @@ -484,9 +461,9 @@ void sockets_initialize(void) { void sockets_cleanup(void) { for (i64 i = 0; i < MAX_NUM_SOCKETS; ++i) - if (_sockets[i].socket != -1) { + if (_sockets[i].ready) { close(_sockets[i].socket); - _sockets[i].socket = -1; + _sockets[i].ready = 0; } } @@ -494,15 +471,15 @@ b8 sockets_open(u16 slot, IP_Address address, u16 *local_port) { sockets_initialize(); b8 change_address = - _sockets[slot].socket == -1 + !_sockets[slot].ready || _sockets[slot].address.protocol != address.protocol || (address.port != 0 && _sockets[slot].local_port != address.port) || (memcmp(_sockets[slot].address.v6_address, &(u8[sizeof address.v6_address]) {0}, sizeof address.v6_address) != 0 && memcmp(_sockets[slot].address.v6_address, address.v6_address, sizeof address.v6_address) != 0); - if (change_address && _sockets[slot].socket != -1) { + if (change_address && _sockets[slot].ready) { close(_sockets[slot].socket); - _sockets[slot].socket = -1; + _sockets[slot].ready = 0; } struct sockaddr *p; @@ -519,7 +496,7 @@ b8 sockets_open(u16 slot, IP_Address address, u16 *local_port) { p_len = sizeof a6; } - if (_sockets[slot].socket == -1) { + if (!_sockets[slot].ready) { _sockets[slot].socket = socket(address.protocol == IPv4_UDP ? AF_INET : AF_INET6, SOCK_DGRAM, IPPROTO_UDP); if (_sockets[slot].socket == -1) { @@ -538,11 +515,15 @@ b8 sockets_open(u16 slot, IP_Address address, u16 *local_port) { } if (bind(_sockets[slot].socket, p, p_len) == -1) { + close(_sockets[slot].socket); + fprintf(stderr, "ERROR: bind failed (errno %d)\n", errno); return 0; } if (getsockname(_sockets[slot].socket, p, &(socklen_t) {p_len}) == -1) { + close(_sockets[slot].socket); + fprintf(stderr, "ERROR: getsockname failed (errno %d)\n", errno); return 0; } @@ -552,6 +533,7 @@ b8 sockets_open(u16 slot, IP_Address address, u16 *local_port) { else _sockets[slot].local_port = ntohs(a6.sin6_port); + _sockets[slot].ready = 1; _sockets[slot].address = address; } -- cgit v1.2.3