网络地址转换api函数
一)struct sockaddr//这个为通用socket地址,由于历史原因存在,使用网络地址结构时要转换为此结构
{
unsigned short family;
char sa_data[14]
}
struct sockaddr_in //实际使用的socket地址结构
{
short int sin_port //网络字节序 htons(),相反为ntohs
sin_family
struct in_addr sin_addr
}
struct in_addr//给此地址赋值必须先转换为网络字节序比如:htonl(),相反为ntohl
{
in_addr_t s_addr//32位IP地址,其字节顺序为网络顺序(network byte ordered),即该无符号整数采用大端字节序
}
根据DNS域名获得IP地址的方法
首先使用函数gethostbyname(char *name)返回一个struct hostent *指针类型:相反的函数为struct hostent* gethostbyaddr(const char *adrr,size_t len,int family)
struct hostent
{
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list; //存储主机所有地址信息,保存的是网络字节序,可以直接复制给sin_addr
}
#define h_addr h_addr_list[0] //主机第一个地址信息,但是地址为字符串信息需要转换为
struct in_addr,因为 inet_ntoa()需要in_addr信息
主机名的获得方法:int uname(struct utsname* name) 或者gethostname(char * name,size_t namelen )//namelen为存储数组大小
struct utsname
{
char sysname[_uts_namesize] //存储以'\0'结尾的字符串信息,表示操作系统名字
char nodename[_uts] //此节点名字即主机名
char release[]
char version[]
char machine[]
}
字节网络序函数数:htons,htonl,ntohs,ntohl
字节操作函数:bzero(void* dest,size_t nbytes) bcopy() bcmp()
memset(void* dest ,int c,size_t len) memcpy() memcmp()
memcpy()不能处理源和目的相同的情况
地址转换函数:在ASCII字符串和网络字节序的二进制值(此值存于套接口地址结构中)间转换
int inet_aton(const char* strptr,struct sin_addr* addr)//返回1正确,可以对sin_addr赋值
s_addr_t inet_addr(cosnt char* strptr);//正确放回32位字节序可以对sin_addr.s_addr赋值,错误返回INADDE_NONE
char* inet_ntoa(struct in_addr inaddr);//返回点分十进制数串的指针
浙公网安备 33010602011771号