Added: 增加IPv6支持

1、增加检测主机是否配置IPv4地址和是否配置IPv6地址的方法。
2、修改sf_service.c文件中_socket_server方法,以支持IPv4和IPv6地址,当服务器为双栈时,优先选择IPv4地址。
pull/6/head
sunqiangwei1988 2023-11-02 10:27:22 +08:00
parent 58a796e169
commit c619a5336d
4 changed files with 78 additions and 3 deletions

View File

@ -521,7 +521,7 @@ 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;
int htable_init_capacity;
int result;

View File

@ -25,6 +25,7 @@
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <ifaddrs.h>
#include "fastcommon/logger.h"
#include "fastcommon/sockopt.h"
#include "fastcommon/shared_func.h"
@ -348,7 +349,23 @@ static void *worker_thread_entrance(void *arg)
static int _socket_server(const char *bind_addr, int port, int *sock)
{
int result;
// 如果bind_addr未设置
if(strlen(bind_addr) == 0){
// 如果当前服务不存在IPv4地址但是存在IPv6地址则自动绑定IPv6地址
if(!checkHostHasIPv4Addr() && checkHostHasIPv6Addr()){
*sock = socketServerIPv6(bind_addr, port, &result);
}else{
*sock = socketServer(bind_addr, port, &result);
}
}else if (is_ipv6_addr(bind_addr)) // 通过判断IP地址是IPv4或者IPv6根据结果进行初始化
{
*sock = socketServerIPv6(bind_addr, port, &result);
}else{
*sock = socketServer(bind_addr, port, &result);
}
if (*sock < 0) {
return result;
}
@ -760,3 +777,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;
}

View File

@ -161,6 +161,12 @@ static inline void sf_release_task(struct fast_task_info *task)
}
}
// 判断当前服务器是否存在IPv4地址
bool checkHostHasIPv4Addr();
// 判断当前服务器是否存在IPv6地址
bool checkHostHasIPv6Addr();
#ifdef __cplusplus
}
#endif

View File

@ -35,7 +35,7 @@
#define SF_SERVER_TASK_TYPE_CHANNEL_USER 102 //for request idempotency
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);