sockaddr和sockaddr_in结构体
struct sockaddr
{
unsigned short sa_family;/*addressfamily,AF_xxx*/
char sa_data[14];/*14bytesofprotocoladdress*/
};
family地址家族,套接字编程中是AF_INET,代表TCP/IP协议。
sata代表协议地址(IP地址)。
这也是soockaddr的缺陷所在,将地址和端口信息混在一个14字节的串中。
struct sockaddr_in
{
short sin_family;/*Address family一般来说AF_INET(地址族)PF_INET(协议族)*/
unsigned short sin_port;/*Port number(必须要采用网络数据格式,普通数字可以用htons()函数转换成网络数据格式的数字)*/
struct in_addr sin_addr;/*IP address in network byte order(Internet address)*/
unsigned char sin_zero[8];/*Same size as struct sockaddr没有实际意义,只是为了 跟SOCKADDR结构在内存中对齐*/
};
//in_addr结构体
typedef uint32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
};
所以定义一个sockaddr_in结构体变量的的时候可以这么赋值
struct sockaddr_in servaddr;
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr= htons(INADDR_A/NY);//0.0.0.0泛指本机
servaddr.sin_port =htons(8080);
htons和htonl
相同点是二者都是将本机的字节序转换为网络字节序即大端字节序(让我想起了面试题),有一点不同是,htons()将参数u_shorthostshort:16位无符号整数转换,htonl将uint32_t hostlong32位无符号长整形转换。
二者混淆某些情况下会导致错误。
最近的事也渐渐接近尾声,有时间去学习新知识了,最近开始看UNP这本书,开始回忆暑假学过的一些套接字编程的一些事,不同的是这次开始关注细节,暑假时间比较紧迫没有时间,在书上时间获取程序的基础上右加了个线程池,改成了多线程时间获取程序,顺便回忆了一下线程的相关知识。