Merge pull request #6 from sunqiangwei1988/master

Added: 增加IPv6支持
use_iouring
YuQing 2023-11-23 15:58:43 +08:00 committed by GitHub
commit 0e1fcdafce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 78 additions and 3 deletions

View File

@ -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;

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"
@ -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;
}

View File

@ -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)
{

View File

@ -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);