sockopt.[hc]: getIpAndPort support ipv6

remotes/origin/fstore_storage_engine
YuQing 2022-10-17 15:58:27 +08:00
parent b52e516aee
commit 7289215470
2 changed files with 21 additions and 22 deletions

View File

@ -1,4 +1,7 @@
Version 1.63 2022-10-16
* sockopt.[hc]: getIpAndPort support ipv6
Version 1.62 2022-09-28 Version 1.62 2022-09-28
* add function fc_sleep_us * add function fc_sleep_us
* add function fc_itoa * add function fc_itoa

View File

@ -1101,58 +1101,54 @@ const char * fc_inet_ntop(const struct sockaddr *addr,
in_addr_t getIpaddr(getnamefunc getname, int sock, \ in_addr_t getIpaddr(getnamefunc getname, int sock, \
char *buff, const int bufferSize) char *buff, const int bufferSize)
{ {
struct sockaddr addr; sockaddr_convert_t convert;
socklen_t addrlen;
memset(&addr, 0, sizeof(addr)); memset(&convert, 0, sizeof(convert));
addrlen = sizeof(addr); convert.len = sizeof(convert.sa);
if (getname(sock, &convert.sa.addr, &convert.len) != 0)
if (getname(sock, &addr, &addrlen) != 0)
{ {
*buff = '\0'; *buff = '\0';
return INADDR_NONE; 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 else
{ {
*buff = '\0'; *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, int getIpAndPort(getnamefunc getname, int sock,
char *buff, const int bufferSize, int *port) char *buff, const int bufferSize, int *port)
{ {
struct sockaddr addr; sockaddr_convert_t convert;
socklen_t addrlen;
memset(&addr, 0, sizeof(addr)); memset(&convert, 0, sizeof(convert));
addrlen = sizeof(addr); convert.len = sizeof(convert.sa);
if (getname(sock, &convert.sa.addr, &convert.len) != 0)
if (getname(sock, &addr, &addrlen) != 0)
{ {
*buff = '\0'; *buff = '\0';
return errno != 0 ? errno : EINVAL; 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 else
{ {
*buff = '\0'; *buff = '\0';
} }
if (addr.sa_family == AF_INET) { if (convert.sa.addr.sa_family == AF_INET) {
*port = ntohs(((struct sockaddr_in *)&addr)->sin_port); *port = ntohs(convert.sa.addr4.sin_port);
} else { } else {
*port = ntohs(((struct sockaddr_in6 *)&addr)->sin6_port); *port = ntohs(convert.sa.addr6.sin6_port);
} }
return 0; return 0;
} }