From 8ff671feb64fec67b980284b439068e487f7dd0c Mon Sep 17 00:00:00 2001 From: Robbie Shade Date: Fri, 28 Aug 2015 11:20:09 -0400 Subject: [PATCH 1/2] Add SOCK_NONBLOCK option to UDP sockets. --- src/core/iomgr/udp_server.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/core/iomgr/udp_server.c b/src/core/iomgr/udp_server.c index 6429c38b289..0508853b2e6 100644 --- a/src/core/iomgr/udp_server.c +++ b/src/core/iomgr/udp_server.c @@ -370,7 +370,8 @@ int grpc_udp_server_add_port(grpc_udp_server *s, const void *addr, int addr_len, /* Try listening on IPv6 first. */ addr = (struct sockaddr *)&wild6; addr_len = sizeof(wild6); - fd = grpc_create_dualstack_socket(addr, SOCK_DGRAM, IPPROTO_UDP, &dsmode); + fd = grpc_create_dualstack_socket(addr, SOCK_DGRAM | SOCK_NONBLOCK, + IPPROTO_UDP, &dsmode); allocated_port1 = add_socket_to_server(s, fd, addr, addr_len, read_cb); if (fd >= 0 && dsmode == GRPC_DSMODE_DUALSTACK) { goto done; @@ -384,7 +385,8 @@ int grpc_udp_server_add_port(grpc_udp_server *s, const void *addr, int addr_len, addr_len = sizeof(wild4); } - fd = grpc_create_dualstack_socket(addr, SOCK_DGRAM, IPPROTO_UDP, &dsmode); + fd = grpc_create_dualstack_socket(addr, SOCK_DGRAM | SOCK_NONBLOCK, + IPPROTO_UDP, &dsmode); if (fd < 0) { gpr_log(GPR_ERROR, "Unable to create socket: %s", strerror(errno)); } From 6f03dff90b9e117a2a52239ed1b91944a47916a0 Mon Sep 17 00:00:00 2001 From: Robbie Shade Date: Tue, 1 Sep 2015 10:35:39 -0400 Subject: [PATCH 2/2] Use standard grpc_ functions to set nonblock. --- src/core/iomgr/udp_server.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/core/iomgr/udp_server.c b/src/core/iomgr/udp_server.c index 0508853b2e6..69e0f992a2f 100644 --- a/src/core/iomgr/udp_server.c +++ b/src/core/iomgr/udp_server.c @@ -231,6 +231,11 @@ static int prepare_socket(int fd, const struct sockaddr *addr, int addr_len) { goto error; } + if (!grpc_set_socket_nonblocking(fd, 1) || !grpc_set_socket_cloexec(fd, 1)) { + gpr_log(GPR_ERROR, "Unable to configure socket %d: %s", fd, + strerror(errno)); + } + get_local_ip = 1; rc = setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &get_local_ip, sizeof(get_local_ip)); @@ -370,8 +375,7 @@ int grpc_udp_server_add_port(grpc_udp_server *s, const void *addr, int addr_len, /* Try listening on IPv6 first. */ addr = (struct sockaddr *)&wild6; addr_len = sizeof(wild6); - fd = grpc_create_dualstack_socket(addr, SOCK_DGRAM | SOCK_NONBLOCK, - IPPROTO_UDP, &dsmode); + fd = grpc_create_dualstack_socket(addr, SOCK_DGRAM, IPPROTO_UDP, &dsmode); allocated_port1 = add_socket_to_server(s, fd, addr, addr_len, read_cb); if (fd >= 0 && dsmode == GRPC_DSMODE_DUALSTACK) { goto done; @@ -385,8 +389,7 @@ int grpc_udp_server_add_port(grpc_udp_server *s, const void *addr, int addr_len, addr_len = sizeof(wild4); } - fd = grpc_create_dualstack_socket(addr, SOCK_DGRAM | SOCK_NONBLOCK, - IPPROTO_UDP, &dsmode); + fd = grpc_create_dualstack_socket(addr, SOCK_DGRAM, IPPROTO_UDP, &dsmode); if (fd < 0) { gpr_log(GPR_ERROR, "Unable to create socket: %s", strerror(errno)); }