From 7289215470acd63d87375a7ef6038b4c13735499 Mon Sep 17 00:00:00 2001 From: YuQing <384681@qq.com> Date: Mon, 17 Oct 2022 15:58:27 +0800 Subject: [PATCH] sockopt.[hc]: getIpAndPort support ipv6 --- HISTORY | 3 +++ src/sockopt.c | 40 ++++++++++++++++++---------------------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/HISTORY b/HISTORY index d21aece..a19ae18 100644 --- a/HISTORY +++ b/HISTORY @@ -1,4 +1,7 @@ +Version 1.63 2022-10-16 + * sockopt.[hc]: getIpAndPort support ipv6 + Version 1.62 2022-09-28 * add function fc_sleep_us * add function fc_itoa diff --git a/src/sockopt.c b/src/sockopt.c index b45b364..541d43c 100644 --- a/src/sockopt.c +++ b/src/sockopt.c @@ -1069,7 +1069,7 @@ int socketClientEx2(int af, const char *server_ip, return sock; } -const char * fc_inet_ntop(const struct sockaddr *addr, +const char *fc_inet_ntop(const struct sockaddr *addr, char *buff, const int bufferSize) { void *sin_addr; @@ -1101,58 +1101,54 @@ const char * fc_inet_ntop(const struct sockaddr *addr, in_addr_t getIpaddr(getnamefunc getname, int sock, \ char *buff, const int bufferSize) { - struct sockaddr addr; - socklen_t addrlen; + sockaddr_convert_t convert; - memset(&addr, 0, sizeof(addr)); - addrlen = sizeof(addr); - - if (getname(sock, &addr, &addrlen) != 0) + memset(&convert, 0, sizeof(convert)); + convert.len = sizeof(convert.sa); + if (getname(sock, &convert.sa.addr, &convert.len) != 0) { *buff = '\0'; return INADDR_NONE; } - if (addrlen > 0) + if (convert.len > 0) { - fc_inet_ntop(&addr, buff, bufferSize); + fc_inet_ntop(&convert.sa.addr, buff, bufferSize); } else { *buff = '\0'; } - - return ((struct sockaddr_in *)&addr)->sin_addr.s_addr; //DO NOT support IPv6 + + return convert.sa.addr4.sin_addr.s_addr; //DO NOT support IPv6 } int getIpAndPort(getnamefunc getname, int sock, char *buff, const int bufferSize, int *port) { - struct sockaddr addr; - socklen_t addrlen; + sockaddr_convert_t convert; - memset(&addr, 0, sizeof(addr)); - addrlen = sizeof(addr); - - if (getname(sock, &addr, &addrlen) != 0) + memset(&convert, 0, sizeof(convert)); + convert.len = sizeof(convert.sa); + if (getname(sock, &convert.sa.addr, &convert.len) != 0) { *buff = '\0'; return errno != 0 ? errno : EINVAL; } - if (addrlen > 0) + if (convert.len > 0) { - fc_inet_ntop(&addr, buff, bufferSize); + fc_inet_ntop(&convert.sa.addr, buff, bufferSize); } else { *buff = '\0'; } - if (addr.sa_family == AF_INET) { - *port = ntohs(((struct sockaddr_in *)&addr)->sin_port); + if (convert.sa.addr.sa_family == AF_INET) { + *port = ntohs(convert.sa.addr4.sin_port); } else { - *port = ntohs(((struct sockaddr_in6 *)&addr)->sin6_port); + *port = ntohs(convert.sa.addr6.sin6_port); } return 0; }