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;
}
|