From dda8968c71f684235abb3cf6c26810751bf2c31a Mon Sep 17 00:00:00 2001 From: yuangongji <82787816@qq.com> Date: Sat, 12 Oct 2019 18:45:52 +0800 Subject: evutil: implement socketpair with unix domain socket on Win10 --- listener.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'listener.c') diff --git a/listener.c b/listener.c index f5c00c9c..bf55f7b5 100644 --- a/listener.c +++ b/listener.c @@ -39,6 +39,9 @@ #include #include #endif +#ifdef EVENT__HAVE_AFUNIX_H +#include +#endif #include #ifdef EVENT__HAVE_SYS_SOCKET_H #include @@ -217,6 +220,7 @@ evconnlistener_new_bind(struct event_base *base, evconnlistener_cb cb, int on = 1; int family = sa ? sa->sa_family : AF_UNSPEC; int socktype = SOCK_STREAM | EVUTIL_SOCK_NONBLOCK; + int support_keepalive = 1; if (backlog == 0) return NULL; @@ -228,8 +232,17 @@ evconnlistener_new_bind(struct event_base *base, evconnlistener_cb cb, if (fd == -1) return NULL; - if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void*)&on, sizeof(on))<0) - goto err; +#if defined(_WIN32) && defined(EVENT__HAVE_AFUNIX_H) + if (family == AF_UNIX && evutil_check_working_afunix_()) { + /* AF_UNIX socket can't set SO_KEEPALIVE option on Win10. + * Avoid 10042 error. */ + support_keepalive = 0; + } +#endif + if (support_keepalive) { + if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void*)&on, sizeof(on))<0) + goto err; + } if (flags & LEV_OPT_REUSEABLE) { if (evutil_make_listen_socket_reuseable(fd) < 0) @@ -504,6 +517,10 @@ new_accepting_socket(struct evconnlistener_iocp *lev, int family) addrlen = sizeof(struct sockaddr_in); else if (family == AF_INET6) addrlen = sizeof(struct sockaddr_in6); +#ifdef EVENT__HAVE_AFUNIX_H + else if (family == AF_UNIX && evutil_check_working_afunix_()) + addrlen = sizeof(struct sockaddr_un); +#endif else return NULL; buflen = (addrlen+16)*2; -- cgit v1.2.1