sockaddr
头文件:
#include <sys/socket.h>
数据结构:
struct sockaddr {
sa_family_t sin_family;//地址族
char sa_data[14]; //14字节,包含套接字中的目标地址和端口信息
};
sockaddr的缺陷是:sa_data把目标地址和端口信息混在一起了
sockaddr_in
头文件:
#include <netinet/in.h>
数据结构:
struct sockaddr_in {
short int sin_family; //地址族
unsigned short int sin_port; //端口号
struct in_addr sin_addr; //Internet地址
unsigned char sin_zero[8]; //字符数组sin_zero[8]的存在是为了保证结构体struct sockaddr_in的大小和结构体struct sockaddr的大小相等
};
其中in_addr结构体用于存放一个32位的IPv4地址
struct in_addr {
in_addr_t s_addr;
};
sin_port和sin_addr都必须是网络字节序(NBO),一般可视化的数字都是主机字节序(HBO)。
sockaddr_in解决了sockaddr的缺陷,把port和addr 分开储存在两个变量中
sockaddr和sockaddr_in的区别
二者长度一样,都是16个字节,因此可以互相转化,从这个意义上说,他们并无区别。
sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息。是一种通用的套接字地址。
sockaddr_in 是internet环境下套接字的地址形式。所以在网络编程中我们会对sockaddr_in结构体进行操作。使用sockaddr_in来建立所需的信息,最后使用类型转化就可以了。
以connect函数为例:
/*
* connect()用于建立与指定socket的连接
* int connect(SOCKET s, const struct sockaddr * name, int namelen);
* s:标识一个未连接socket
* name:指向要连接套接字的sockaddr结构体的指针
* namelen:sockaddr结构体的字节长度
* 若无错误发生,则connect()返回0。否则返回SOCKET_ERROR错误
*/
connect函数的第二个参数要求时sockaddr类型的,使用该函数时需进行如下所示类型转化:
其他函数同理。