From c59def90fb3442e2426e4050c4021dcf27d33c12 Mon Sep 17 00:00:00 2001 From: angt Date: Thu, 17 Dec 2015 23:20:31 +0100 Subject: [PATCH] Try to use SO_ACCEPTFILTER to defer accept on non-linux platforms --- src/main.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main.c b/src/main.c index 7e7b7c0..840ac11 100644 --- a/src/main.c +++ b/src/main.c @@ -98,6 +98,7 @@ enum sk_opt { sk_keepintvl, sk_congestion, sk_defer_accept, + sk_acceptfilter, sk_quickack, }; @@ -143,6 +144,11 @@ static void sk_set (int fd, enum sk_opt opt, const void *val, socklen_t len) [sk_quickack] = { "TCP_QUICKACK", #ifdef TCP_QUICKACK 1, IPPROTO_TCP, TCP_QUICKACK, +#endif + }, + [sk_acceptfilter] = { "SO_ACCEPTFILTER", +#ifdef SO_ACCEPTFILTER + 1, SOL_SOCKET, SO_ACCEPTFILTER, #endif }, }; @@ -165,21 +171,23 @@ static int sk_listen (int fd, struct addrinfo *ai) { sk_set_int(fd, sk_reuseaddr, 1); - int ret = bind(fd, ai->ai_addr, ai->ai_addrlen); - - if (ret==-1) { + if (bind(fd, ai->ai_addr, ai->ai_addrlen)==-1) { perror("bind"); return -1; } - ret = listen(fd, 8); - - if (ret==-1) { + if (listen(fd, 8)==-1) { perror("listen"); return -1; } +#ifdef __linux__ sk_set_int(fd, sk_defer_accept, GT_TIMEOUT/1000); +#else + char data[256] = {0}; + str_cpy(data, "dataready", sizeof(data)-1); + sk_set(fd, sk_acceptfilter, &data, sizeof(data)); +#endif return 0; }