addrinfo& sockaddr结构解析
来源:互联网 发布:建筑工程软件有哪些 编辑:程序博客网 时间:2024/06/05 05:57
1 addrinfo
addrinfo
结构内容如下:
struct addrinfo { int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */ int ai_family; /* PF_xxx */ int ai_socktype; /* SOCK_xxx */ int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ socklen_t ai_addrlen; /* length of ai_addr */ char *ai_canonname; /* canonical name for hostname */ struct sockaddr *ai_addr; /* binary address */ struct addrinfo *ai_next; /* next structure in linked list */};
1.1 ai_family
ai_family
指定了地址族,可取值如下:
void print_family(struct addrinfo *aip){ printf(" family "); switch (aip->ai_family) { case AF_INET: printf("inet"); break;T case AF_INET6: printf("inet6"); break; case AF_UNIX: printf("unix"); break; case AF_UNSPEC: printf("unspecified"); break; default: printf("unknown"); }}
1.2 ai_socketype
void print_type(struct addrinfo *aip){ printf(" type "); switch (aip->ai_socktype) { case SOCK_STREAM: printf("stream"); break; case SOCK_DGRAM: printf("datagram"); break; case SOCK_SEQPACKET: printf("seqpacket"); break; case SOCK_RAW: printf("raw"); break; default: printf("unknown (%d)", aip->ai_socktype); }}
1.3 ai_protocol
void print_protocol(struct addrinfo *aip){ printf(" protocol "); switch (aip->ai_protocol) { case 0: printf("default"); break; case IPPROTO_TCP: printf("TCP"); break; case IPPROTO_UDP: printf("UDP"); break; case IPPROTO_RAW: printf("raw"); break; default: printf("unknown (%d)", aip->ai_protocol); }}
1.4 ai_flags
void print_flags(struct addrinfo *aip){ printf("flags"); if (aip->ai_flags == 0) { printf(" 0"); } else { if (aip->ai_flags & AI_PASSIVE) printf(" passive"); if (aip->ai_flags & AI_CANONNAME) printf(" canon"); if (aip->ai_flags & AI_NUMERICHOST) printf(" numhost");#if defined(AI_NUMERICSERV) if (aip->ai_flags & AI_NUMERICSERV) printf(" numserv");#endif#if defined(AI_V4MAPPED) if (aip->ai_flags & AI_V4MAPPED) printf(" v4mapped");#endif#if defined(AI_ALL) if (aip->ai_flags & AI_ALL) printf(" all");#endif }}
1.5 sockaddr
套接字体制二级制表示。详见第2节。
2. sockaddr
& sockaddr_in
sockaddr
:
struct sockaddr { unsigned short sa_family; /* address family, AF_xxx */ char sa_data[14]; /* 14 bytes of protocol address */};
- sa_family是地址家族,一般都是“AF_xxx”的形式。好像通常大多用的是都是AF_INET
- sa_data是14字节协议地址
此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构:sockaddr_in
:
// sockaddr_in(在netinet/in.h中定义):struct sockaddr_in { short int sin_family; /* Address family */ unsigned short int sin_port; /* Port number */ struct in_addr sin_addr; /* Internet address */ unsigned char sin_zero[8]; /* Same size as struct sockaddr */};struct in_addr { __be32 s_addr;};
- sin_family指代协议族,在socket编程中只能是AF_INET
- sin_port存储端口号(使用网络字节顺序)
- sin_addr存储IP地址,使用in_addr这个数据结构,sin_addr按照网络字节顺序存储IP地址
- sin_zero是为了让
sockaddr
与sockaddr_in
两个数据结构保持大小相同而保留的空字节。
sockaddr_in
和sockaddr
是并列的结构,指向sockaddr_in
的结构体的指针也可以指向 sockadd
的结构体,并代替它。也就是说,你可以使用sockaddr_in
建立你所需要的信息,
在最后用进行类型转换就可以了bzero((char*)&mysock,sizeof(mysock));
//初始化:mysock; // 结构体名mysock.sa_family=AF_INET;mysock.sin_addr.s_addr=inet_addr("192.168.0.1");
阅读全文
0 0
- addrinfo& sockaddr结构解析
- addrinfo结构体详解
- struct addrinfo结构体
- addrinfo的结构体
- SOCKADDR结构
- struct addrinfo结构体详解
- addrinfo结构体与getaddrinfo函数
- addrinfo结构体与getaddrinfo函数
- sockaddr结构与sockaddr_in结构
- sockaddr与sockaddr_in结构体
- 结构体struct sockaddr sockaddr_in
- socket编程之addrinfo结构体与getaddrinfo函数
- socket编程之addrinfo结构体与getaddrinfo函数
- socket编程之addrinfo结构体与getaddrinfo函数
- socket编程之addrinfo结构体与getaddrinfo函数
- socket编程之addrinfo结构体与getaddrinfo函数
- socket编程之addrinfo结构体与getaddrinfo函数
- socket编程之addrinfo结构体与getaddrinfo函数
- 打开或关闭 Windows 功能
- 深入理解javaScript原型和闭包(1)--- 一切都是对象
- React-Native调试工具
- 表达式计算(栈)
- [Paper Reading]EFFICIENT VECTOR REPRESENTATION FOR DOCUMENTS THROUGH CORRUPTION
- addrinfo& sockaddr结构解析
- HDOH 2309 ICPC Score Totalizer Software(水题)
- MR--WordCount的MapReduce程序注释
- DTE与DCE
- 单点登录原理与简单实现
- java编程思想-内部类
- 基数排序
- Lua中function总结
- ajax方式和修改form属性action(提交路径)方式提交form表单