summaryrefslogtreecommitdiff
path: root/examples/echo.c
diff options
context:
space:
mode:
authorMitya Selivanov <automainint@guattari.tech>2024-08-12 19:12:29 +0200
committerMitya Selivanov <automainint@guattari.tech>2024-08-12 19:12:29 +0200
commitb253481005f53280a295453d0cc23c6fcd12a113 (patch)
treea1a7610aae54966d9f0b9bd07052bafcafd48991 /examples/echo.c
parent1a36359f563ca41e3a833399821357bc674a56df (diff)
downloadreduced_system_layer-b253481005f53280a295453d0cc23c6fcd12a113.zip
Fix UDP sockets
Diffstat (limited to 'examples/echo.c')
-rwxr-xr-xexamples/echo.c58
1 files changed, 20 insertions, 38 deletions
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 "<connected>" - 1,
- (u8 *) "<connected>",
- NULL
- );
-
for (;;) {
- p_send(
- 0,
- (IP_Address) {
- .protocol = IPv4_UDP,
- .port = PORT,
- .v4_address = { 127, 0, 0, 1 },
- },
- sizeof "<heartbeat>" - 1,
- (u8 *) "<heartbeat>",
- 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 <netdb.h>
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;
}