#include <netinet/in_systm.h>
#include <netinet/in.h>
#include <netinet/ip.h>
+#include <netinet/tcp.h>
#ifdef HAVE_NETINET_IP_VAR_H
# include <netinet/ip_var.h>
int count;
int on = 1;
int timeout = 5;
-int initial_pause = 0;
+int initial_pause = 0, tfo = 0;
int use_ipv4 = 1;
int use_ipv6 = 1;
int debug = 0;
"\n\t-noipv6 disable ipv6"
"\n\t-oP file write PID to file"
"\n\t-t n n seconds timeout"
+ "\n\t-tfo enable TCP Fast Open"
);
exit(0);
}
while (na < argc && argv[na][0] == '-')
{
if (strcmp(argv[na], "-d") == 0) debug = 1;
+ else if (strcmp(argv[na], "-tfo") == 0) tfo = 1;
else if (strcmp(argv[na], "-t") == 0)
{
if (tmo_noerror = ((timeout = atoi(argv[++na])) < 0)) timeout = -timeout;
printf("IPv6 socket creation failed: %s\n", strerror(errno));
exit(1);
}
-
+#ifdef TCP_FASTOPEN
+ if (tfo)
+ {
+ int backlog = 5;
+ if (setsockopt(listen_socket[v6n], IPPROTO_TCP, TCP_FASTOPEN,
+ &backlog, sizeof(backlog)))
+ if (debug) printf("setsockopt TCP_FASTOPEN: %s\n", strerror(errno));
+ }
+#endif
/* If this is an IPv6 wildcard socket, set IPV6_V6ONLY if that option is
available. */
printf("IPv4 socket creation failed: %s\n", strerror(errno));
exit(1);
}
+#ifdef TCP_FASTOPEN
+ if (tfo)
+ {
+ int backlog = 5;
+ if (setsockopt(listen_socket[v4n], IPPROTO_TCP, TCP_FASTOPEN,
+ &backlog, sizeof(backlog)))
+ if (debug) printf("setsockopt TCP_FASTOPEN: %s\n", strerror(errno));
+ }
+#endif
}
}
sin6.sin6_addr = anyaddr6;
if (bind(listen_socket[i], (struct sockaddr *)&sin6, sizeof(sin6)) < 0)
{
- printf("IPv6 socket bind() failed: %s\n", strerror(errno));
+ printf("IPv6 socket bind(port %d) failed: %s\n", port, strerror(errno));
exit(1);
}
}
if (bind(listen_socket[i], (struct sockaddr *)&sin4, sizeof(sin4)) < 0)
if (listen_socket[v6n] < 0 || errno != EADDRINUSE)
{
- printf("IPv4 socket bind() failed: %s\n", strerror(errno));
+ printf("IPv4 socket bind(port %d) failed: %s\n", port, strerror(errno));
exit(1);
}
else
for (count = 0; count < connection_count; count++)
{
- struct {
- int left;
- BOOL in_use;
- } content_length = { 0, FALSE };
-
alarm(timeout);
if (port <= 0)
{
n = dlen < sizeof(buffer) ? dlen : sizeof(buffer);
if ((n = read(dup_accept_socket, CS buffer, n)) == 0)
{
- printf("Unxpected EOF read from client\n");
+ printf("Unexpected EOF read from client\n");
s = s->next;
goto END_OFF;
}
while (dlen-- > 0)
if (fgetc(in) == EOF)
{
- printf("Unxpected EOF read from client\n");
+ printf("Unexpected EOF read from client\n");
s = s->next;
goto END_OFF;
}
alarm(timeout);
n = read(dup_accept_socket, CS buffer+offset, s->len - offset);
- if (content_length.in_use) content_length.left -= n;
if (n == 0)
{
printf("%sxpected EOF read from client\n",
if (data) do
{
n = (read(dup_accept_socket, &c, 1) == 1 && c == '.');
- if (content_length.in_use) content_length.left--;
while (c != '\n' && read(dup_accept_socket, &c, 1) == 1)
- if (content_length.in_use) content_length.left--;
+ ;
} while (!n);
else if (memcmp(ss, buffer, n) != 0)
{
goto END_OFF;
}
alarm(0);
- n = strlen(CS buffer);
- if (content_length.in_use) content_length.left -= (n - offset);
+ n = (int)strlen(CS buffer);
while (n > 0 && isspace(buffer[n-1])) n--;
buffer[n] = 0;
printf("%s\n", buffer);
break;
}
}
-
- if (sscanf(CCS buffer, "<Content-length: %d", &content_length.left))
- content_length.in_use = TRUE;
- if (content_length.in_use && content_length.left <= 0)
- shutdown(dup_accept_socket, SHUT_RD);
}
}