通用的socket地址
#include<bits/scoket.h>
struct sockaddr{
sa_family_t sa_family;
char sa_data[14];
}
sa_family成员是地址族类型
PF(AF)_UNIX,PF(AF)_INET,PF(AF)_INET6
sa长度不够,定义了新的通用的存储结构
struct sockeaddr_storage{
sa_family_t sa_family;
unsigned long int _ss_align;
char __ss_padding[128-sizeof(__ss_align)]
}
上述的两个通用的socket结构不常用,操作不方便
专业的socket
#include<sys/un.h>
struct socketaddr_un{
sa_family_t sin_family;//地址族
char sun_path[108];//文件路径名
}
TCP/IP协议族有sockaddr_in sockaddr_in6两个专用结构体用于ip4,ip6
struct sockadd_in{
sa_family_t sin_family;//AF_INET
u_int16_t sin_port;//端口
struct in_addr sin_addr;//ipv4地址结构
}
struct in_add{
u_int32_t s_addr;//ipv4网络字节序列
};
struct sockaddr_in6{
sa_family_t sin6_family;//AF_INET
u_int16_t sin6_port;//端口
struct
struct in6_addr sin6_addr;//地址
u_int32_t sin6_scope_id;
};
struct in6_add{
unsigned char sa_addr[16];//ipv6网络字节序列
};
ip地址转换函数
in_addr_t inet_addr(const char* strptr);
int inet_aton(const char*cp,struct in_addr);
char* inet_ntoa(struct in_addr in);
对于ipv6
//af协议族
inet_pton(int af,char* src,void* dist);//转换成网络多字
const char* inet_ntop(int af,const void* src,char* dist,socket_len nt);//转换成字符串
socket_len nt 指定存储目标的大小
/**
*
*/
#include <stdio.h>
#include <arpa/inet.h>
void ipChange();
int main(int argc, const char * argv[]) {
ipChange();
return 0;
}
void ipChange(){
//struct in_addr s1;
in_addr_t t1;
t1 = inet_addr("221.179.10.13");
struct in_addr ia;
inet_aton("221.179.10.13", &ia);
printf("ia.s_addr=%d\n",ia.s_addr);
printf("real_ip=%s",inet_ntoa(ia));
}