diff --git a/src/sf_connection_manager.c b/src/sf_connection_manager.c index 878d0f0..e7e35d0 100644 --- a/src/sf_connection_manager.c +++ b/src/sf_connection_manager.c @@ -521,12 +521,13 @@ int sf_connection_manager_init_ex(SFConnectionManager *cm, connect_done_callback, void *args, FCServerConfig *server_cfg, const bool bg_thread_enabled) { - const int socket_domain = AF_INET; + const int socket_domain = AF_UNSPEC; struct { ConnectionExtraParams holder; ConnectionExtraParams *ptr; } extra_params; FCServerGroupInfo *server_group; + int htable_init_capacity; int result; diff --git a/src/sf_service.c b/src/sf_service.c index eac611f..a202283 100644 --- a/src/sf_service.c +++ b/src/sf_service.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "fastcommon/logger.h" #include "fastcommon/sockopt.h" #include "fastcommon/shared_func.h" @@ -349,7 +350,22 @@ int sf_socket_create_server(SFListener *listener, { int result; - listener->sock = socketServer2(af, bind_addr, listener->port, &result); + // 如果bind_addr未设置 + if (strlen(bind_addr) == 0) { + // 如果当前服务不存在IPv4地址,但是存在IPv6地址,则自动绑定IPv6地址 + if(!checkHostHasIPv4Addr() && checkHostHasIPv6Addr()){ + listener->sock = socketServerIPv6(bind_addr, port, &result); + }else{ + listener->sock = socketServer(bind_addr, port, &result); + } + } else if (is_ipv6_addr(bind_addr)) // 通过判断IP地址是IPv4或者IPv6,根据结果进行初始化 + { + listener->sock = socketServerIPv6(bind_addr, port, &result); + }else{ + listener->sock = socketServer(bind_addr, port, &result); + } + + // listener->sock = socketServer2(af, bind_addr, listener->port, &result); if (listener->sock < 0) { return result; } @@ -840,3 +856,55 @@ void sf_set_sig_quit_handler(sf_sig_quit_handler quit_handler) { sig_quit_handler = quit_handler; } + +// 判断当前服务器是否存在IPv4地址 +bool checkHostHasIPv4Addr(){ + struct ifaddrs *ifaddr, *ifa; + if (getifaddrs(&ifaddr) == -1) { + return false; + } + + bool hasIPv4 = false; + for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { + if (ifa->ifa_addr == NULL) { + continue; + } + if (strcmp(ifa->ifa_name, "lo") == 0) { // 排除lo接口 + continue; + } + if (ifa->ifa_addr->sa_family == AF_INET) { + hasIPv4 = true; + break; + } + } + + freeifaddrs(ifaddr); + + return hasIPv4; +} + +// 判断当前服务器是否存在IPv6地址 +bool checkHostHasIPv6Addr(){ + struct ifaddrs *ifaddr, *ifa; + if (getifaddrs(&ifaddr) == -1) { + return false; + } + + bool hasIPv6 = false; + for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { + if (ifa->ifa_addr == NULL) { + continue; + } + if (strcmp(ifa->ifa_name, "lo") == 0) { // 排除lo接口 + continue; + } + if (ifa->ifa_addr->sa_family == AF_INET6) { + hasIPv6 = true; + break; + } + } + + freeifaddrs(ifaddr); + + return hasIPv6; +} \ No newline at end of file diff --git a/src/sf_service.h b/src/sf_service.h index 3169b72..dd2b428 100644 --- a/src/sf_service.h +++ b/src/sf_service.h @@ -190,6 +190,12 @@ static inline void sf_release_task(struct fast_task_info *task) } } +// 判断当前服务器是否存在IPv4地址 +bool checkHostHasIPv4Addr(); + +// 判断当前服务器是否存在IPv6地址 +bool checkHostHasIPv6Addr(); + static inline SFNetworkHandler *sf_get_first_network_handler_ex( SFContext *sf_context) { diff --git a/src/sf_types.h b/src/sf_types.h index f3c77d2..32f427a 100644 --- a/src/sf_types.h +++ b/src/sf_types.h @@ -39,7 +39,7 @@ #define SF_RDMACM_NETWORK_HANDLER_INDEX 1 typedef int (*sf_accept_done_callback)(struct fast_task_info *task, - const in_addr_t client_addr, const bool bInnerPort); + const in_addr_64_t client_addr, const bool bInnerPort); typedef int (*sf_set_body_length_callback)(struct fast_task_info *task); typedef char *(*sf_alloc_recv_buffer_callback)(struct fast_task_info *task, const int buff_size, bool *new_alloc);