I2Addr CreateListenSocket(I2Addr addr, char* serv, int options, int buf_size) { int fd = -1; socklen_t optlen; int set_size; if (addr && (I2AddrFD(addr) > -1)) { log_println(1, "Invalid I2Addr record - fd already specified."); goto error; } if ((!addr) && !(addr = I2AddrByWildcard(get_errhandle(), SOCK_STREAM, serv))) { log_println(1, "Unable to create I2Addr record by wildcard."); goto error; } if (!I2AddrSetPassive(addr, True)) { log_println(1, "Unable to set passive mode in I2Addr record."); goto error; } // create and bind socket using arguments, prefering v6 (since v6 addresses // can be both v4 and v6). #ifdef AF_INET6 if ((options & OPT_IPV4_ONLY) == 0) fd = OpenSocket(addr, serv, AF_INET6, options); #endif if (fd < 0) if ((options & OPT_IPV6_ONLY) == 0) fd = OpenSocket(addr, serv, AF_INET, options); if (fd < 0) { log_println(1, "Unable to open socket."); goto error; } /* Set sock opt code from Marion Nakanson <[email protected] * OHSU Advanced Computing Center * email on 2/19/09 correctly notes that setsockops must be made before open() * or listen() calls are made */ optlen = sizeof(set_size); // get send buffer size getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &set_size, &optlen); log_print(5, "\nSend buffer initialized to %d, ", set_size); // get receive buffer size getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &set_size, &optlen); log_println(5, "Receive buffer initialized to %d", set_size); // now assign buffer sizes passed as arguments if (buf_size > 0) { setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &buf_size, sizeof(buf_size)); setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &buf_size, sizeof(buf_size)); // print values set to help user verify getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &set_size, &optlen); log_print(5, "Changed buffer sizes: Send buffer set to %d(%d), ", set_size, buf_size); getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &set_size, &optlen); log_println(5, "Receive buffer set to %d(%d)", set_size, buf_size); } // listen on socket for connections, with backlog queue length = NDT_BACKLOG if (listen(fd, NDT_BACKLOG) < 0) { // if listen returns value <0, then error log_println(1, "listen(%d,%d):%s", fd, NDT_BACKLOG, strerror(errno)); goto error; } return addr; // If error, try freeing memory error: I2AddrFree(addr); return NULL; }
I2Addr CreateListenSocket(I2Addr addr, char* serv, int options, int buf_size) { int fd = -1; socklen_t optlen; int set_size; if (addr && (I2AddrFD(addr) > -1)) { log_println(1, "Invalid I2Addr record - fd already specified."); goto error; } if ((!addr) && !(addr = I2AddrByWildcard(get_errhandle(), SOCK_STREAM, serv))) { log_println(1, "Unable to create I2Addr record by wildcard."); goto error; } if (!I2AddrSetPassive(addr,True)) { log_println(1, "Unable to set passive mode in I2Addr record."); goto error; } fd = OpenSocket(addr, serv, options); if (fd < 0) { log_println(1, "Unable to open socket."); goto error; } /* Set sock opt code from Marion Nakanson <[email protected] * OHSU Advanced Computing Center * email on 2/19/09 correctly notes that setsockops must be made before open() * or listen() calls are made */ optlen = sizeof(set_size); getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &set_size, &optlen); log_print(5, "\nSend buffer initialized to %d, ", set_size); getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &set_size, &optlen); log_println(5, "Receive buffer initialized to %d", set_size); if (buf_size > 0) { setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &buf_size, sizeof(buf_size)); setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &buf_size, sizeof(buf_size)); getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &set_size, &optlen); log_print(5, "Changed buffer sizes: Send buffer set to %d(%d), ", set_size, buf_size); getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &set_size, &optlen); log_println(5, "Receive buffer set to %d(%d)", set_size, buf_size); } if (listen(fd, NDT_BACKLOG) < 0) { log_println(1, "listen(%d,%d):%s", fd, NDT_BACKLOG, strerror(errno)); goto error; } return addr; error: I2AddrFree(addr); return NULL; }