socket api
1、字节序(大端、小端)
#include <netinet/in.h>
unsigned long int htonl(unsigned long int hostlong) //主机字节序转换成网络字节序(长整型)
unsigned short int htons(unsigned short int hostshort) //主机字节序转换成网络字节序(短整型)
unsigned short int ntohl(unsigned short int netlong) //网络字节序转换成主机字节序(长整型)
unsigned short int ntohs(unsigned short int netshort) //网络字节序转换成主机字节序(短整型)
2、通用socket地址
#include <bits/socket.h>
struct sockaddr {
as_family_t s sa_family; //地址族类型
char sa_data[14];
}
协议族和地址族的关系
协议族 地址族 描述
PF_UNIX AF_UNIX UNIX本地域协议族
PF_INET AF_INET TCP/IPv4协议族
PF_INET6 AF_INET6 TCP/IPv6协议族
宏PF*和AF*都定义在bits/socket.h头文件中,且后者与前者有完全相同的值,所以二者通常混用。
协议族与其他值
协议族 地址值含义和长度
PF_UNIX 文件的路径名,长度可达到108字节
PF_INET 16 bit 端口号和 32 bit IPv4地址,共6字节
PF_INET6 16 bit 端口号,32 bit 流标识,128 bit IPv6地址,32 bit 范围ID,26字节
由于14字节的sa_data根本无法容纳多数协议的地址值,定义了新的地质结构体。
#include <bits/socket.h>
struct sockaddr_storage{
sa_family_t sa_fmily;
unsiged long int __ss_align;
char __ss_padding[128-sizeof(__ss_align)];
}
3、专用socket地址
UNIX本地域协议族:
#include <sys/un.h>
struct sockaddr_un {
sa_family_t sin_family; //地址族
char sun_path[108]; //文件路径名
}
TCP/IP协议族:
struct scokaddr_in {
sa_family_t sin_family; //地址族
}