- if (passive) {
- local = ai;
- remote = NULL;
- } else {
- local = NULL;
- remote = ai;
- }
-
- /* Iterate over all src/dst combination, exhausting dst first */
- for (src = local, dst = remote; src != NULL || dst != NULL; /* no op */ ) {
- ret = socket(src ? src->ai_family : dst->ai_family,
- sock_type(l4type), l4type);
- if (ret < 0)
- goto get_next_dst;
- sockfd = ret;
- flowopt_setopts(sockfd, fo);
- if (passive) {
- /*
- * Reuse the address on passive sockets to avoid
- * failure on restart (protocols using listen()) and
- * when creating multiple listener instances (UDP
- * multicast).
- */
- if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on,
- sizeof(on)) == -1) {
- ret = -ERRNO_TO_PARA_ERROR(errno);
- close(sockfd);
- PARA_ERROR_LOG("can not set SO_REUSEADDR: %s\n",
- para_strerror(-ret));
- break;
- }
- if (bind(sockfd, src->ai_addr, src->ai_addrlen) < 0) {
- close(sockfd);
- goto get_next_src;
+ for (; ai; ai = ai->ai_next) {
+ int fd;
+ ret = socket(ai->ai_family, sock_type(l4type), l4type);
+ if (ret < 0) {
+ PARA_NOTICE_LOG("socket(): %s\n", strerror(errno));
+ continue;
+ }
+ fd = ret;
+ flowopt_setopts(fd, fo);
+ if (!passive) {
+ if (connect(fd, ai->ai_addr, ai->ai_addrlen) < 0) {
+ PARA_NOTICE_LOG("connect(): %s\n",
+ strerror(errno));
+ close(fd);
+ continue;