aboutsummaryrefslogtreecommitdiff
path: root/archived/v1/recv.c
blob: 042d8a9f16389b224e2cd9f87d74b975a232d516 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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;
}