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 */
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) {
*/
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) {