套接字地址结构
1. IPv4套接字地址结构
IPv4套接字地址结构通常称为“网际套接字地址结构”,它以sockadd_in命名,定义在
<netinet/in.h>头文件中。
struct in_addr{
in_addr_t s_addr; /*32位IPv4地址,网络字节序*/
};
struct sockaddr_in{
uint8_t sin_len;
sa_family_t sin_family; /*AF_INET*/
in_port_t sin_port; /*16位TCP或者UDP端口号,网络字节序*/
struct in_addr sin_addr; /*32位IPv4结构,网络字节序*/
char sin_zero[8]; /*未使用*/
};
当作为一个参数传递给任何套接字函数时,套接字地址结构总是以引用形式(也就是以指向该结构的指针)来传递。然而以这样的指针作为参数之一的任何套接字函数必须处理来自所支持的任何协议族的套接字地址结构。
在<sys/socket.h>头文件中定义一个通用的套接字地址结构如下:
struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family; /*地址族:AF_xxx*/
char sa_data[4]; /**/
1. IPv4套接字地址结构
IPv4套接字地址结构通常称为“网际套接字地址结构”,它以sockadd_in命名,定义在
<netinet/in.h>头文件中。
struct in_addr{
in_addr_t s_addr; /*32位IPv4地址,网络字节序*/
};
struct sockaddr_in{
uint8_t sin_len;
sa_family_t sin_family; /*AF_INET*/
in_port_t sin_port; /*16位TCP或者UDP端口号,网络字节序*/
struct in_addr sin_addr; /*32位IPv4结构,网络字节序*/
char sin_zero[8]; /*未使用*/
};
POSIX规范只需要这个结构中的3个字段:sin_family、sin_addr和sin_port。
当作为一个参数传递给任何套接字函数时,套接字地址结构总是以引用形式(也就是以指向该结构的指针)来传递。然而以这样的指针作为参数之一的任何套接字函数必须处理来自所支持的任何协议族的套接字地址结构。
在<sys/socket.h>头文件中定义一个通用的套接字地址结构如下:
struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family; /*地址族:AF_xxx*/
char sa_data[4]; /**/
};
3. 值-结果参数
(1) 从进程到内核传递套接字地址结构的函数有3个:bind、connect和sendto。这些函数的一个参数是执行某个套接字地址结构的指针,另一个参数是该结构的证书大小。
将指针和指针所指向内容的大小都传递给内核,于是内核知道到底需从进程复制多少数据。
(2) 从内核到进程传递套接字地址结构的函数有4个:accept、recvfrom、getsockname和getpeername。这4个函数的其中两个参数指向某个套接字地址结构的指针和指向表示该结构大小的整数变量的指针
当函数背调用时,结构大小是一个值,它告诉内核该结构的大小,这样内核在写该结构时不至于越界;当函数返回时,结构大小又是一个结构,它告诉进程内核在该结构中究竟存储了多少信息。