更好的方法是使用可移植的库函数!
这将会:
- 通过添加对IPv6的支持,使您的代码具有未来的可扩展性
- 使您的代码与许多其他使用IP地址的函数兼容。
例如:
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
void main(){
char str[INET_ADDRSTRLEN];
struct sockaddr_in sa;
unsigned char a_ipv4addr[4] = {192,168,1,60};
memcpy(&sa.sin_addr.s_addr,&a_ipv4addr,4);
inet_ntop(AF_INET, &sa.sin_addr, str, INET_ADDRSTRLEN);
printf("Bad example with memcpy: %s\n", str);
sprintf(str,"%i.%i.%i.%i",a_ipv4addr[0],a_ipv4addr[1],a_ipv4addr[2],a_ipv4addr[3]);
inet_pton(AF_INET, str, &(sa.sin_addr));
inet_ntop(AF_INET, &sa.sin_addr, str, INET_ADDRSTRLEN);
printf("Better example from generated string: %s\n", str);
unsigned int ipv4addr=0x3c01a8c0;
sa.sin_addr.s_addr=ipv4addr;
inet_ntop(AF_INET, &sa.sin_addr, str, INET_ADDRSTRLEN);
printf("Example from unsigned int: %s\n", str);
ipv4addr=192+(168<<8)+(1<<16)+(60<<24);
sa.sin_addr.s_addr=ipv4addr;
inet_ntop(AF_INET, &sa.sin_addr, str, INET_ADDRSTRLEN);
printf("Example from unsigned int decimal example: %s\n", str);
inet_pton(AF_INET, "9.9.9.9", &(sa.sin_addr));
inet_ntop(AF_INET, &(sa.sin_addr), str, INET_ADDRSTRLEN);
printf("Example from string: %s\n", str);
}
如果您使用的是Linux系统,请尝试以下命令:
man inet_addr
了解更多!
inet_ntoa
及其相关函数。您需要将输入格式更改为不同的格式(打包到32位整数中而不是int数组中),但标准化的代码可能更加健壮。 - Nate Eldredge