Windows 环境下的 Socket 编程 2 - 地址族与数据序列

Posted 研究是为了理解

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows 环境下的 Socket 编程 2 - 地址族与数据序列相关的知识,希望对你有一定的参考价值。

地址族

《Windows 环境下的 Socket 编程 1 - 环境搭建和 Socket 相关函数》这篇文章中,提到过 socket 函数,其原型为:

/*成功返回 SOCKET 句柄,失败返回 INVALID_SOCKET*/
SOCKET socket(int af,int type,int protocol);

其中第一个参数 af 用于指定 SOCKET 使用的 协议族 ,常见协议族有:IPv4 协议族(PF_INET)、IPv6 协议族(PF_INET6)等。
本节重点在于 IPv4 协议族的地址信息表示。
bind 函数、 accept 函数、connect 函数都要求传入 struct sockaddr 类型的指针,以 bind 为例:

/*成功返回 0 ,失败返回 SOCKET_ERROR*/
int bind(SOCKET s,const struct sockaddr *name,int namelen);

结构体 struct sockaddr 用于保存地址信息中需要包含的 地址族端口号IP地址。该结构体的声明为:

struct sockaddr 
	u_short	sa_family;			// 地址族
	char	sa_data[14];		// 地址信息(端口号、IP 地址等)
;

sockaddr 用于所有协议族的地址信息,因而它的地址信息预留了 14 字节内存。
可以看到,将端口号、IP 地址这些信息写入 sa_data 数组中十分麻烦,因为端口号是 16 位数据, IP 地址是 32 位数据,需要将它们转换成字节流。为此,对于 IPv4 协议族,就有了新的结构体 sockaddr_in

struct sockaddr_in 
	short	sin_family;
	u_short	sin_port;
	struct in_addr	sin_addr;
	char	sin_zero[8];
;

有了这个结构体,IPv4 应用可以方便的填写端口号和 IP 地址信息。由于 IPv4 的地址信息只有端口号和 IP 地址,所以预留了 8 字节的 sin_zero 数组,IPv4 协议族并不使用,只是为了保持和结构体 sockaddr 的一致。

让我们看一下结构体 sockaddr_in 的成员:

  • sin_family:地址族,有 IPv4 使用的地址族(AF_INET)、IPv6 使用的地址族(AF_INET6
  • sin_port:端口号,以网络字节序保存(大端模式)
  • sin_addr:IP 地址,以网络字节序保存

bind 函数为例,看一下结构体 sockaddr_in 的使用:

struct sockaddr_in serv_addr;
// ...
if(bind(hServSock, (sockaddr*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
    ErrorHandler("bind socket error");
// ...

网络字节序与地址变换

以上是关于Windows 环境下的 Socket 编程 2 - 地址族与数据序列的主要内容,如果未能解决你的问题,请参考以下文章

Windows 环境下的 Socket 编程 2 - 地址族与数据序列

Windows 环境下的 Socket 编程 1 - 环境搭建和 Socket 相关函数

Windows 环境下的 Socket 编程 1 - 环境搭建和 Socket 相关函数

Windows 环境下的 Socket 编程 1 - 环境搭建和 Socket 相关函数

Windows 环境下的 Socket 编程 3 - 基于 TCP 的服务器/客户端

Windows 环境下的 Socket 编程 3 - 基于 TCP 的服务器/客户端