http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201121505130366/
Linux网络编程----IP转换函数--inet_addr和inet_ntoa
Linux下IP转换工具::
#Include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
strcut sockaddr_in src;
src.sin_addr.s_addr = inet_addr("*.*.*.*"); //构建网络地址。
printf("%s\n",inet_ntoa(src.sin_addr)); //将网络地址转换成字符串。
注意::
inet_ntoa存在的问题是inet_ntoa的返回值是一个static类型的char *指针,所以会出现问题::
char *a1,a2;
src.sin_addr.s_addr = inet_addr("192.168.1.123");
a1 =inet_ntoa(src.sin_addr);
src.sin_addr.s_addr = inet_addr("192.168.1.124");
a2 = inet_ntoa(src.sin_addr);
printf("a1:%s\n",a1);
显示为:: a1:192.168.1.124
printf("a2:%s\n",a2);
显示为: a2:192.168.1.124
原因是静态的static char *
Linux网络通信----网络地址构建struct sockaddr_in
Linux下网络编程,一般需要包含的头文件包括:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#Include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
Linux下网络地址有:
struct sockaddr
{
unsigned int sin_family; //取值AF_INET;
char sa_data[14];
}
这种结构不常用,常用的是:
struct sockaddr_in
{
short int sin_family; //取值AF_INET;
unsigned short int sin_port; //取值htons(PORT);
struct in_addr sin_addr; //取值.sin_addr.s_addr = inet_addr("*.*.*.*");
unsigned char sin_zero[8]; //取值bzero(.sin_zero,8)或memset(.sin_zero,0,8);
}
其中:
struct in_addr
{
unsigned long s_addr; //存储IP地址。
}
所以创建一个网络地址::
strcut sockaddr_in src;
src.sin_family = AF_INET;
src.sin_addr.s_addr = inet_addr("*.*.*.*");
bzero(src.sin_zero,8);
其中用到了,inet_addr是linux提供的网络编程中使用的IP转换工具。
inet_addr("*.*.*.*");将字符串IP地址转换成网络地址,并且是网络字节序的。
相反的转换工具有inet_ntoa等。