1*1f5a5310Sfengbojiang #include <stdio.h>
2*1f5a5310Sfengbojiang #include <stdlib.h>
3*1f5a5310Sfengbojiang #include <stdint.h>
4*1f5a5310Sfengbojiang #include <string.h>
5*1f5a5310Sfengbojiang #include <strings.h>
6*1f5a5310Sfengbojiang #include <sys/types.h>
7*1f5a5310Sfengbojiang #include <sys/socket.h>
8*1f5a5310Sfengbojiang #include <arpa/inet.h>
9*1f5a5310Sfengbojiang #include <errno.h>
10*1f5a5310Sfengbojiang #include <assert.h>
11*1f5a5310Sfengbojiang
12*1f5a5310Sfengbojiang #include "ff_config.h"
13*1f5a5310Sfengbojiang #include "ff_api.h"
14*1f5a5310Sfengbojiang
15*1f5a5310Sfengbojiang #define MAX_EVENTS 512
16*1f5a5310Sfengbojiang
17*1f5a5310Sfengbojiang /* kevent set */
18*1f5a5310Sfengbojiang struct kevent kevSet;
19*1f5a5310Sfengbojiang /* events */
20*1f5a5310Sfengbojiang struct kevent events[MAX_EVENTS];
21*1f5a5310Sfengbojiang /* kq */
22*1f5a5310Sfengbojiang int kq;
23*1f5a5310Sfengbojiang int sockfd;
24*1f5a5310Sfengbojiang #ifdef INET6
25*1f5a5310Sfengbojiang int sockfd6;
26*1f5a5310Sfengbojiang #endif
27*1f5a5310Sfengbojiang
28*1f5a5310Sfengbojiang char html[] =
29*1f5a5310Sfengbojiang "HTTP/1.1 200 OK\r\n"
30*1f5a5310Sfengbojiang "Server: F-Stack\r\n"
31*1f5a5310Sfengbojiang "Date: Sat, 25 Feb 2017 09:26:33 GMT\r\n"
32*1f5a5310Sfengbojiang "Content-Type: text/html\r\n"
33*1f5a5310Sfengbojiang "Content-Length: 438\r\n"
34*1f5a5310Sfengbojiang "Last-Modified: Tue, 21 Feb 2017 09:44:03 GMT\r\n"
35*1f5a5310Sfengbojiang "Connection: keep-alive\r\n"
36*1f5a5310Sfengbojiang "Accept-Ranges: bytes\r\n"
37*1f5a5310Sfengbojiang "\r\n"
38*1f5a5310Sfengbojiang "<!DOCTYPE html>\r\n"
39*1f5a5310Sfengbojiang "<html>\r\n"
40*1f5a5310Sfengbojiang "<head>\r\n"
41*1f5a5310Sfengbojiang "<title>Welcome to F-Stack!</title>\r\n"
42*1f5a5310Sfengbojiang "<style>\r\n"
43*1f5a5310Sfengbojiang " body { \r\n"
44*1f5a5310Sfengbojiang " width: 35em;\r\n"
45*1f5a5310Sfengbojiang " margin: 0 auto; \r\n"
46*1f5a5310Sfengbojiang " font-family: Tahoma, Verdana, Arial, sans-serif;\r\n"
47*1f5a5310Sfengbojiang " }\r\n"
48*1f5a5310Sfengbojiang "</style>\r\n"
49*1f5a5310Sfengbojiang "</head>\r\n"
50*1f5a5310Sfengbojiang "<body>\r\n"
51*1f5a5310Sfengbojiang "<h1>Welcome to F-Stack!</h1>\r\n"
52*1f5a5310Sfengbojiang "\r\n"
53*1f5a5310Sfengbojiang "<p>For online documentation and support please refer to\r\n"
54*1f5a5310Sfengbojiang "<a href=\"http://F-Stack.org/\">F-Stack.org</a>.<br/>\r\n"
55*1f5a5310Sfengbojiang "\r\n"
56*1f5a5310Sfengbojiang "<p><em>Thank you for using F-Stack.</em></p>\r\n"
57*1f5a5310Sfengbojiang "</body>\r\n"
58*1f5a5310Sfengbojiang "</html>";
59*1f5a5310Sfengbojiang
60*1f5a5310Sfengbojiang
61*1f5a5310Sfengbojiang char html1[] =
62*1f5a5310Sfengbojiang "HTTP/1.1 200 OK\r\n"
63*1f5a5310Sfengbojiang "Server: F-Stack\r\n"
64*1f5a5310Sfengbojiang "Date: Sat, 25 Feb 2017 09:26:33 GMT\r\n"
65*1f5a5310Sfengbojiang "Content-Type: text/html\r\n"
66*1f5a5310Sfengbojiang "Content-Length: 9438\r\n"
67*1f5a5310Sfengbojiang "Last-Modified: Tue, 21 Feb 2017 09:44:03 GMT\r\n"
68*1f5a5310Sfengbojiang "Connection: keep-alive\r\n"
69*1f5a5310Sfengbojiang "Accept-Ranges: bytes\r\n"
70*1f5a5310Sfengbojiang "\r\n"
71*1f5a5310Sfengbojiang "<!DOCTYPE html>\r\n"
72*1f5a5310Sfengbojiang "<html>\r\n"
73*1f5a5310Sfengbojiang "<head>\r\n"
74*1f5a5310Sfengbojiang "<title>Welcome to F-Stack!</title>\r\n"
75*1f5a5310Sfengbojiang "<style>\r\n"
76*1f5a5310Sfengbojiang " body { \r\n"
77*1f5a5310Sfengbojiang " width: 35em;\r\n"
78*1f5a5310Sfengbojiang " margin: 0 auto; \r\n"
79*1f5a5310Sfengbojiang " font-family: Tahoma, Verdana, Arial, sans-serif;\r\n"
80*1f5a5310Sfengbojiang " }\r\n"
81*1f5a5310Sfengbojiang "</style>\r\n"
82*1f5a5310Sfengbojiang "</head>\r\n"
83*1f5a5310Sfengbojiang "<body>\r\n"
84*1f5a5310Sfengbojiang "<h1>Welcome to F-Stack!</h1>\r\n"
85*1f5a5310Sfengbojiang "\r\n"
86*1f5a5310Sfengbojiang "<p>For online documentation and support please refer to012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234"
87*1f5a5310Sfengbojiang
88*1f5a5310Sfengbojiang "5678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234"
89*1f5a5310Sfengbojiang
90*1f5a5310Sfengbojiang "56789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\r\n"
91*1f5a5310Sfengbojiang "<a href=\"http://F-Stack.org/\">F-Stack.org</a>.<br/>\r\n"
92*1f5a5310Sfengbojiang "\r\n"
93*1f5a5310Sfengbojiang "<p><em>Thank you for using F-Stack.</em></p>\r\n"
94*1f5a5310Sfengbojiang "</body>\r\n"
95*1f5a5310Sfengbojiang "</html>";
96*1f5a5310Sfengbojiang
97*1f5a5310Sfengbojiang char html2[] =
98*1f5a5310Sfengbojiang "HTTP/1.1 200 OK\r\n"
99*1f5a5310Sfengbojiang "Server: F-Stack\r\n"
100*1f5a5310Sfengbojiang "Date: Sat, 25 Feb 2017 09:26:33 GMT\r\n"
101*1f5a5310Sfengbojiang "Content-Type: text/html\r\n"
102*1f5a5310Sfengbojiang "Content-Length: 1228\r\n"
103*1f5a5310Sfengbojiang "Last-Modified: Tue, 21 Feb 2017 09:44:03 GMT\r\n"
104*1f5a5310Sfengbojiang "Connection: keep-alive\r\n"
105*1f5a5310Sfengbojiang "Accept-Ranges: bytes\r\n"
106*1f5a5310Sfengbojiang "\r\n"
107*1f5a5310Sfengbojiang "<!DOCTYPE html>\r\n"
108*1f5a5310Sfengbojiang "<html>\r\n"
109*1f5a5310Sfengbojiang "<head>\r\n"
110*1f5a5310Sfengbojiang "<title>Welcome to F-Stack!</title>\r\n"
111*1f5a5310Sfengbojiang "<style>\r\n"
112*1f5a5310Sfengbojiang " body { \r\n"
113*1f5a5310Sfengbojiang " width: 35em;\r\n"
114*1f5a5310Sfengbojiang " margin: 0 auto; \r\n"
115*1f5a5310Sfengbojiang " font-family: Tahoma, Verdana, Arial, sans-serif;\r\n"
116*1f5a5310Sfengbojiang " }\r\n"
117*1f5a5310Sfengbojiang "</style>\r\n"
118*1f5a5310Sfengbojiang "</head>\r\n"
119*1f5a5310Sfengbojiang "<body>\r\n"
120*1f5a5310Sfengbojiang "<h1>Welcome to F-Stack!</h1>\r\n"
121*1f5a5310Sfengbojiang "\r\n"
122*1f5a5310Sfengbojiang "<p>For online documentation and support please refer to0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\r\n"
123*1f5a5310Sfengbojiang "<a href=\"http://F-Stack.org/\">F-Stack.org</a>.<br/>\r\n"
124*1f5a5310Sfengbojiang "\r\n"
125*1f5a5310Sfengbojiang "<p><em>Thank you for using F-Stack.</em></p>\r\n"
126*1f5a5310Sfengbojiang "</body>\r\n"
127*1f5a5310Sfengbojiang "</html>";
128*1f5a5310Sfengbojiang
129*1f5a5310Sfengbojiang extern int ff_zc_mbuf_get(struct ff_zc_mbuf *m, int len);
130*1f5a5310Sfengbojiang extern int ff_zc_mbuf_write(struct ff_zc_mbuf *m, const char *data, int len);
131*1f5a5310Sfengbojiang
132*1f5a5310Sfengbojiang char *buf_tmp;
133*1f5a5310Sfengbojiang char html_buf[10240];
134*1f5a5310Sfengbojiang size_t buf_len = 0;
135*1f5a5310Sfengbojiang struct ff_zc_mbuf zc_buf;
136*1f5a5310Sfengbojiang
loop(void * arg)137*1f5a5310Sfengbojiang int loop(void *arg)
138*1f5a5310Sfengbojiang {
139*1f5a5310Sfengbojiang /* Wait for events to happen */
140*1f5a5310Sfengbojiang unsigned nevents = ff_kevent(kq, NULL, 0, events, MAX_EVENTS, NULL);
141*1f5a5310Sfengbojiang unsigned i;
142*1f5a5310Sfengbojiang
143*1f5a5310Sfengbojiang buf_len = sizeof(html) - 1;
144*1f5a5310Sfengbojiang buf_tmp = html;
145*1f5a5310Sfengbojiang
146*1f5a5310Sfengbojiang for (i = 0; i < nevents; ++i) {
147*1f5a5310Sfengbojiang struct kevent event = events[i];
148*1f5a5310Sfengbojiang int clientfd = (int)event.ident;
149*1f5a5310Sfengbojiang
150*1f5a5310Sfengbojiang /* Handle disconnect */
151*1f5a5310Sfengbojiang if (event.flags & EV_EOF) {
152*1f5a5310Sfengbojiang /* Simply close socket */
153*1f5a5310Sfengbojiang ff_close(clientfd);
154*1f5a5310Sfengbojiang #ifdef INET6
155*1f5a5310Sfengbojiang } else if (clientfd == sockfd || clientfd == sockfd6) {
156*1f5a5310Sfengbojiang #else
157*1f5a5310Sfengbojiang } else if (clientfd == sockfd) {
158*1f5a5310Sfengbojiang #endif
159*1f5a5310Sfengbojiang int available = (int)event.data;
160*1f5a5310Sfengbojiang do {
161*1f5a5310Sfengbojiang int nclientfd = ff_accept(clientfd, NULL, NULL);
162*1f5a5310Sfengbojiang if (nclientfd < 0) {
163*1f5a5310Sfengbojiang printf("ff_accept failed:%d, %s\n", errno,
164*1f5a5310Sfengbojiang strerror(errno));
165*1f5a5310Sfengbojiang break;
166*1f5a5310Sfengbojiang }
167*1f5a5310Sfengbojiang
168*1f5a5310Sfengbojiang /* Add to event list */
169*1f5a5310Sfengbojiang EV_SET(&kevSet, nclientfd, EVFILT_READ, EV_ADD, 0, 0, NULL);
170*1f5a5310Sfengbojiang
171*1f5a5310Sfengbojiang if(ff_kevent(kq, &kevSet, 1, NULL, 0, NULL) < 0) {
172*1f5a5310Sfengbojiang printf("ff_kevent error:%d, %s\n", errno,
173*1f5a5310Sfengbojiang strerror(errno));
174*1f5a5310Sfengbojiang return -1;
175*1f5a5310Sfengbojiang }
176*1f5a5310Sfengbojiang
177*1f5a5310Sfengbojiang available--;
178*1f5a5310Sfengbojiang } while (available);
179*1f5a5310Sfengbojiang } else if (event.filter == EVFILT_READ) {
180*1f5a5310Sfengbojiang char buf[256];
181*1f5a5310Sfengbojiang size_t readlen = ff_read(clientfd, buf, sizeof(buf));
182*1f5a5310Sfengbojiang #ifdef FSTACK_ZC_SEND
183*1f5a5310Sfengbojiang int ret = ff_zc_mbuf_get(&zc_buf, buf_len);
184*1f5a5310Sfengbojiang if (ret < 0) {
185*1f5a5310Sfengbojiang printf("ff_zc_mbuf_get failed, len:%d, errno:%d, %s\n", buf_len, errno, strerror(errno));
186*1f5a5310Sfengbojiang exit(1);
187*1f5a5310Sfengbojiang }
188*1f5a5310Sfengbojiang
189*1f5a5310Sfengbojiang /* APP can call ff_zc_mbuf_write multi times */
190*1f5a5310Sfengbojiang int len_part = 1440, off, to_write_len;
191*1f5a5310Sfengbojiang for (off = 0; off < buf_len;){
192*1f5a5310Sfengbojiang to_write_len = (buf_len - off) > len_part ? len_part : (buf_len - off);
193*1f5a5310Sfengbojiang ret = ff_zc_mbuf_write(&zc_buf, (const char *)buf_tmp + off, to_write_len);
194*1f5a5310Sfengbojiang if (ret != to_write_len) {
195*1f5a5310Sfengbojiang printf("ff_zc_mbuf_write failed, len:%d, errno:%d, %s\n", to_write_len, errno, strerror(errno));
196*1f5a5310Sfengbojiang exit(1);
197*1f5a5310Sfengbojiang }
198*1f5a5310Sfengbojiang off += to_write_len;
199*1f5a5310Sfengbojiang }
200*1f5a5310Sfengbojiang
201*1f5a5310Sfengbojiang /* Or call ff_zc_mbuf_write one time */
202*1f5a5310Sfengbojiang /*
203*1f5a5310Sfengbojiang if (ret != buf_len) {
204*1f5a5310Sfengbojiang printf("ff_zc_mbuf_write failed, len:%d, errno:%d, %s\n", buf_len, errno, strerror(errno));
205*1f5a5310Sfengbojiang exit(1);
206*1f5a5310Sfengbojiang }
207*1f5a5310Sfengbojiang */
208*1f5a5310Sfengbojiang
209*1f5a5310Sfengbojiang /* Simulate the application load */
210*1f5a5310Sfengbojiang int i, j = 0;
211*1f5a5310Sfengbojiang for (i = 0; i < 10000; i++){
212*1f5a5310Sfengbojiang j++;
213*1f5a5310Sfengbojiang }
214*1f5a5310Sfengbojiang ff_write(clientfd, zc_buf.bsd_mbuf, buf_len);
215*1f5a5310Sfengbojiang #else
216*1f5a5310Sfengbojiang memcpy(html_buf, buf_tmp, buf_len);
217*1f5a5310Sfengbojiang
218*1f5a5310Sfengbojiang /* Simulate the application load */
219*1f5a5310Sfengbojiang int i, j = 0;
220*1f5a5310Sfengbojiang for (i = 0; i < 10000; i++){
221*1f5a5310Sfengbojiang j++;
222*1f5a5310Sfengbojiang }
223*1f5a5310Sfengbojiang
224*1f5a5310Sfengbojiang ff_write(clientfd, html_buf, buf_len);
225*1f5a5310Sfengbojiang #endif
226*1f5a5310Sfengbojiang } else {
227*1f5a5310Sfengbojiang printf("unknown event: %8.8X\n", event.flags);
228*1f5a5310Sfengbojiang }
229*1f5a5310Sfengbojiang
230*1f5a5310Sfengbojiang }
231*1f5a5310Sfengbojiang }
232*1f5a5310Sfengbojiang
main(int argc,char * argv[])233*1f5a5310Sfengbojiang int main(int argc, char * argv[])
234*1f5a5310Sfengbojiang {
235*1f5a5310Sfengbojiang ff_init(argc, argv);
236*1f5a5310Sfengbojiang
237*1f5a5310Sfengbojiang assert((kq = ff_kqueue()) > 0);
238*1f5a5310Sfengbojiang
239*1f5a5310Sfengbojiang sockfd = ff_socket(AF_INET, SOCK_STREAM, 0);
240*1f5a5310Sfengbojiang if (sockfd < 0) {
241*1f5a5310Sfengbojiang printf("ff_socket failed, sockfd:%d, errno:%d, %s\n", sockfd, errno, strerror(errno));
242*1f5a5310Sfengbojiang exit(1);
243*1f5a5310Sfengbojiang }
244*1f5a5310Sfengbojiang
245*1f5a5310Sfengbojiang struct sockaddr_in my_addr;
246*1f5a5310Sfengbojiang bzero(&my_addr, sizeof(my_addr));
247*1f5a5310Sfengbojiang my_addr.sin_family = AF_INET;
248*1f5a5310Sfengbojiang my_addr.sin_port = htons(80);
249*1f5a5310Sfengbojiang my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
250*1f5a5310Sfengbojiang
251*1f5a5310Sfengbojiang int ret = ff_bind(sockfd, (struct linux_sockaddr *)&my_addr, sizeof(my_addr));
252*1f5a5310Sfengbojiang if (ret < 0) {
253*1f5a5310Sfengbojiang printf("ff_bind failed, sockfd:%d, errno:%d, %s\n", sockfd, errno, strerror(errno));
254*1f5a5310Sfengbojiang exit(1);
255*1f5a5310Sfengbojiang }
256*1f5a5310Sfengbojiang
257*1f5a5310Sfengbojiang ret = ff_listen(sockfd, MAX_EVENTS);
258*1f5a5310Sfengbojiang if (ret < 0) {
259*1f5a5310Sfengbojiang printf("ff_listen failed, sockfd:%d, errno:%d, %s\n", sockfd, errno, strerror(errno));
260*1f5a5310Sfengbojiang exit(1);
261*1f5a5310Sfengbojiang }
262*1f5a5310Sfengbojiang
263*1f5a5310Sfengbojiang EV_SET(&kevSet, sockfd, EVFILT_READ, EV_ADD, 0, MAX_EVENTS, NULL);
264*1f5a5310Sfengbojiang /* Update kqueue */
265*1f5a5310Sfengbojiang ff_kevent(kq, &kevSet, 1, NULL, 0, NULL);
266*1f5a5310Sfengbojiang
267*1f5a5310Sfengbojiang #ifdef INET6
268*1f5a5310Sfengbojiang sockfd6 = ff_socket(AF_INET6, SOCK_STREAM, 0);
269*1f5a5310Sfengbojiang if (sockfd6 < 0) {
270*1f5a5310Sfengbojiang printf("ff_socket failed, sockfd6:%d, errno:%d, %s\n", sockfd6, errno, strerror(errno));
271*1f5a5310Sfengbojiang exit(1);
272*1f5a5310Sfengbojiang }
273*1f5a5310Sfengbojiang
274*1f5a5310Sfengbojiang struct sockaddr_in6 my_addr6;
275*1f5a5310Sfengbojiang bzero(&my_addr6, sizeof(my_addr6));
276*1f5a5310Sfengbojiang my_addr6.sin6_family = AF_INET6;
277*1f5a5310Sfengbojiang my_addr6.sin6_port = htons(80);
278*1f5a5310Sfengbojiang my_addr6.sin6_addr = in6addr_any;
279*1f5a5310Sfengbojiang
280*1f5a5310Sfengbojiang ret = ff_bind(sockfd6, (struct linux_sockaddr *)&my_addr6, sizeof(my_addr6));
281*1f5a5310Sfengbojiang if (ret < 0) {
282*1f5a5310Sfengbojiang printf("ff_bind failed, sockfd6:%d, errno:%d, %s\n", sockfd6, errno, strerror(errno));
283*1f5a5310Sfengbojiang exit(1);
284*1f5a5310Sfengbojiang }
285*1f5a5310Sfengbojiang
286*1f5a5310Sfengbojiang ret = ff_listen(sockfd6, MAX_EVENTS);
287*1f5a5310Sfengbojiang if (ret < 0) {
288*1f5a5310Sfengbojiang printf("ff_listen failed, sockfd6:%d, errno:%d, %s\n", sockfd6, errno, strerror(errno));
289*1f5a5310Sfengbojiang exit(1);
290*1f5a5310Sfengbojiang }
291*1f5a5310Sfengbojiang
292*1f5a5310Sfengbojiang EV_SET(&kevSet, sockfd6, EVFILT_READ, EV_ADD, 0, MAX_EVENTS, NULL);
293*1f5a5310Sfengbojiang ff_kevent(kq, &kevSet, 1, NULL, 0, NULL);
294*1f5a5310Sfengbojiang #endif
295*1f5a5310Sfengbojiang
296*1f5a5310Sfengbojiang ff_run(loop, NULL);
297*1f5a5310Sfengbojiang return 0;
298*1f5a5310Sfengbojiang }
299