如何将IP地址提取到字符串中?我找不到一个参考,告诉我如何char sa_data[14]
编码.
只需将整个sockaddr
结构转换为sockaddr_in即可.然后你可以使用:
char *ip = inet_ntoa(their_addr.sin_addr)
检索标准ip表示.
inet_ntoa()
适用于IPv4; inet_ntop()
适用于IPv4和IPv6.
给定输入struct sockaddr *res
,这里有两段代码:
struct sockaddr_in *addr_in = (struct sockaddr_in *)res; char *s = inet_ntoa(addr_in->sin_addr); printf("IP address: %s\n", s);
char *s = NULL; switch(res->sa_family) { case AF_INET: { struct sockaddr_in *addr_in = (struct sockaddr_in *)res; s = malloc(INET_ADDRSTRLEN); inet_ntop(AF_INET, &(addr_in->sin_addr), s, INET_ADDRSTRLEN); break; } case AF_INET6: { struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)res; s = malloc(INET6_ADDRSTRLEN); inet_ntop(AF_INET6, &(addr_in6->sin6_addr), s, INET6_ADDRSTRLEN); break; } default: break; } printf("IP address: %s\n", s); free(s);
埃米尔的答案是正确的,但我的理解inet_ntoa
是弃用了,而你应该使用inet_ntop
.如果您使用的是IPv4,请struct sockaddr
转到sockaddr_in
.您的代码看起来像这样:
struct addrinfo *res; // populated elsewhere in your code struct sockaddr_in *ipv4 = (struct sockaddr_in *)res->ai_addr; char ipAddress[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &(ipv4->sin_addr), ipAddress, INET_ADDRSTRLEN); printf("The IP address is: %s\n", ipAddress);
请查看这个优秀的资源以获得更多解释,包括如何为IPv6地址执行此操作.
一旦sockaddr
投出sockaddr_in
,它就变成了:
struct sockaddr_in { u_short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; };