aboutsummaryrefslogtreecommitdiff
path: root/minirecv.c
blob: bba373af7c6069acd43614ad3e5d41e712c6aa09 (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
60
61
62
63
64
65
66
67
#include "common.h"
#include <arpa/inet.h>
#include <poll.h>
#include <sys/socket.h>
#include <unistd.h>
#include <errno.h>

int main(void)
{
    int serverfd, clientfd;
    int on = 1;

    const struct sockaddr_in address = {
        AF_INET,
        htons(9999),
        {0},
    };

    serverfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    setsockopt(serverfd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
    if (bind(serverfd, (struct sockaddr *)&address, sizeof(address)))
        return 1;

    listen(serverfd, 256);

    writef("serverfd: %d\n", serverfd);
    clientfd = accept(serverfd, 0, 0);
    writef("clientfd: %d\n", clientfd);

    struct pollfd fds[1] = {
        {clientfd, POLLIN, 0},
    };

    for (;;) {
        int ret = poll(fds, 1, 50000);
        if (ret == -1)
            return 2;

        if (fds[0].revents & POLLIN) {
            int nrecv;

            char buf[20];
            
            nrecv = recv(clientfd, buf, sizeof(buf), 0);
            printf("received %d bytes\n", nrecv);
            nrecv = recv(clientfd, buf, sizeof(buf), 0);
            printf("received %d bytes\n", nrecv);
            nrecv = recv(clientfd, buf, sizeof(buf), 0);
            printf("received %d bytes\n", nrecv);

            return 3;

            if (nrecv == -1) {
                return errno;
            } else if (nrecv == 0) {
                writef("Disconnect.\n");
                fds[0].fd = -1;
                fds[0].revents = 0;
                close(clientfd);
            } 

            writef("received: %d bytes\n", nrecv);
        }
    }

    return 0;
}