X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=net.c;h=b44d1d3e5d3a2012b1dfe135ddeec74d10b0fe58;hp=aeeca20e41447d2f3912b3035e739219ff08c62d;hb=8cf2884a87db0eca0aa2f382c9850335332682b3;hpb=6a7f2b1e141f17bdc66c4eb9f43e1f115679943f diff --git a/net.c b/net.c index aeeca20e..b44d1d3e 100644 --- a/net.c +++ b/net.c @@ -384,7 +384,7 @@ int makesock(unsigned l4type, bool passive, struct addrinfo *local = NULL, *src, *remote = NULL, *dst, hints; unsigned int l3type = AF_UNSPEC; - int rc, sockfd = -1, + int rc, on = 1, sockfd = -1, socktype = sock_type(l4type); char port[6]; /* port number has at most 5 digits */ @@ -429,6 +429,18 @@ int makesock(unsigned l4type, bool passive, if (sockfd < 0) goto get_next_dst; + /* + * Reuse the address on passive sockets to avoid failure on + * restart (protocols using listen()) and when creating + * multiple listener instances (UDP multicast). + */ + if (passive && setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, + &on, sizeof(on)) == -1) { + rc = errno; + PARA_ERROR_LOG("can not set SO_REUSEADDR: %s\n", + strerror(rc)); + return -ERRNO_TO_PARA_ERROR(rc); + } flowopt_setopts(sockfd, fo); if (src) { @@ -480,15 +492,8 @@ get_next_src: */ int para_listen(unsigned l4type, uint16_t port, struct flowopts *fo) { - int fd, ret; - - if (fo == NULL) - fo = flowopt_new(); - - /* Reuse the address to avoid failure on restart. */ - OPT_ENABLE(fo, SOL_SOCKET, SO_REUSEADDR); + int ret, fd = makesock(l4type, 1, NULL, port, fo); - fd = makesock(l4type, 1, NULL, port, fo); if (fd > 0) { ret = listen(fd, BACKLOG); if (ret < 0) {