diff options
author | Raymaekers Luca <raymaekers.luca@gmail.com> | 2024-10-24 23:10:31 +0200 |
---|---|---|
committer | Raymaekers Luca <raymaekers.luca@gmail.com> | 2024-10-24 23:10:31 +0200 |
commit | f37cce374cc9da243fc2babbea9a7051f15db80a (patch) | |
tree | 7a6b0e5f7bd38cbd39ba1e1f43689ca6be92c53e /v1/recv.c | |
parent | c7687f88bc5cb4d25304b0ee19789c37aebd7b6d (diff) |
Archive code into v1/ directory
The code was written too fast and I deemed that it would be better to
make a new draft.
Diffstat (limited to 'v1/recv.c')
-rw-r--r-- | v1/recv.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/v1/recv.c b/v1/recv.c new file mode 100644 index 0000000..042d8a9 --- /dev/null +++ b/v1/recv.c @@ -0,0 +1,59 @@ +// Minimal server implementation for probing out things + +#include "common.h" +#include <arpa/inet.h> +#include <assert.h> +#include <poll.h> +#include <sys/socket.h> +#include <unistd.h> + +int main(void) +{ + u32 serverfd, clientfd; + u8 on = 1; + + const struct sockaddr_in address = { + AF_INET, + htons(PORT), + {0}, + }; + + serverfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + setsockopt(serverfd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)); + u32 err = bind(serverfd, (struct sockaddr *)&address, sizeof(address)); + assert(err == 0); + + err = listen(serverfd, 256); + assert(err == 0); + + clientfd = accept(serverfd, 0, 0); + assert(clientfd != -1); + + struct pollfd fds[1] = { + {clientfd, POLLIN, 0}, + }; + + for (;;) { + int ret = poll(fds, 1, 50000); + assert(ret != -1); + + if (fds[0].revents & POLLIN) { + u8 recv_buf[BUF_MAX]; + u32 nrecv = recv(clientfd, recv_buf, sizeof(recv_buf), 0); + assert(nrecv >= 0); + + writef("client(%d): %d bytes received.\n", clientfd, nrecv); + if (nrecv == 0) { + writef("client(%d): disconnected.\n", clientfd); + fds[0].fd = -1; + fds[0].revents = 0; + err = close(clientfd); + assert(err == 0); + + return 0; + } + } + } + + return 0; +} |