int _mkp_network_io_server(int port, char *listen_addr, int reuse_port) { int socket_fd = -1; int ret; char *port_str = 0; unsigned long len; struct addrinfo hints; struct addrinfo *res, *rp; memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; mk_api->str_build(&port_str, &len, "%d", port); ret = getaddrinfo(listen_addr, port_str, &hints, &res); mk_api->mem_free(port_str); if(ret != 0) { mk_err("Can't get addr info: %s", gai_strerror(ret)); return -1; } for(rp = res; rp != NULL; rp = rp->ai_next) { socket_fd = _mkp_network_io_create_socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); if( socket_fd == -1) { mk_warn("Error creating server socket, retrying"); continue; } mk_api->socket_set_tcp_nodelay(socket_fd); mk_api->socket_reset(socket_fd); /* Check if reuse port can be enabled on this socket */ if (reuse_port == MK_TRUE && (mk_api->config->kernel_features & MK_KERNEL_SO_REUSEPORT)) { ret = mk_api->socket_set_tcp_reuseport(socket_fd); if (ret == -1) { mk_warn("Could not use SO_REUSEPORT, using fair balancing mode"); mk_api->config->scheduler_mode = MK_SCHEDULER_FAIR_BALANCING; } } ret = _mkp_network_io_bind(socket_fd, rp->ai_addr, rp->ai_addrlen, MK_SOMAXCONN); if(ret == -1) { mk_err("Cannot listen on %s:%i\n", listen_addr, port); continue; } break; } freeaddrinfo(res); if (rp == NULL) return -1; return socket_fd; }
int _mkp_network_io_server(int port, char *listen_addr) { int socket_fd = -1; int ret; char *port_str = 0; unsigned long len; struct addrinfo hints; struct addrinfo *res, *rp; memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; mk_api->str_build(&port_str, &len, "%d", port); ret = getaddrinfo(listen_addr, port_str, &hints, &res); mk_api->mem_free(port_str); if(ret != 0) { mk_err("Can't get addr info: %s", gai_strerror(ret)); return -1; } for(rp = res; rp != NULL; rp = rp->ai_next) { socket_fd = _mkp_network_io_create_socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); if( socket_fd == -1) { mk_warn("Error creating server socket, retrying"); continue; } mk_api->socket_set_tcp_nodelay(socket_fd); mk_api->socket_reset(socket_fd); ret = _mkp_network_io_bind(socket_fd, rp->ai_addr, rp->ai_addrlen, MK_SOMAXCONN); if(ret == -1) { mk_err("Port %i cannot be used, retrying\n", port); continue; } break; } freeaddrinfo(res); if (rp == NULL) return -1; return socket_fd; }