Added: 增加IPv6支持
1、增加检测主机是否配置IPv4地址和是否配置IPv6地址的方法。 2、修改sf_service.c文件中_socket_server方法,以支持IPv4和IPv6地址,当服务器为双栈时,优先选择IPv4地址。pull/6/head
parent
58a796e169
commit
c619a5336d
|
|
@ -521,7 +521,7 @@ int sf_connection_manager_init_ex(SFConnectionManager *cm,
|
||||||
connect_done_callback, void *args, FCServerConfig *server_cfg,
|
connect_done_callback, void *args, FCServerConfig *server_cfg,
|
||||||
const bool bg_thread_enabled)
|
const bool bg_thread_enabled)
|
||||||
{
|
{
|
||||||
const int socket_domain = AF_INET;
|
const int socket_domain = AF_UNSPEC;
|
||||||
int htable_init_capacity;
|
int htable_init_capacity;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <ifaddrs.h>
|
||||||
#include "fastcommon/logger.h"
|
#include "fastcommon/logger.h"
|
||||||
#include "fastcommon/sockopt.h"
|
#include "fastcommon/sockopt.h"
|
||||||
#include "fastcommon/shared_func.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)
|
static int _socket_server(const char *bind_addr, int port, int *sock)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
*sock = socketServer(bind_addr, port, &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) {
|
if (*sock < 0) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
@ -760,3 +777,55 @@ void sf_set_sig_quit_handler(sf_sig_quit_handler quit_handler)
|
||||||
{
|
{
|
||||||
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;
|
||||||
|
}
|
||||||
|
|
@ -161,6 +161,12 @@ static inline void sf_release_task(struct fast_task_info *task)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 判断当前服务器是否存在IPv4地址
|
||||||
|
bool checkHostHasIPv4Addr();
|
||||||
|
|
||||||
|
// 判断当前服务器是否存在IPv6地址
|
||||||
|
bool checkHostHasIPv6Addr();
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@
|
||||||
#define SF_SERVER_TASK_TYPE_CHANNEL_USER 102 //for request idempotency
|
#define SF_SERVER_TASK_TYPE_CHANNEL_USER 102 //for request idempotency
|
||||||
|
|
||||||
typedef int (*sf_accept_done_callback)(struct fast_task_info *task,
|
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 int (*sf_set_body_length_callback)(struct fast_task_info *task);
|
||||||
typedef char *(*sf_alloc_recv_buffer_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);
|
const int buff_size, bool *new_alloc);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue