3.2 协议特征
3.2.5 从容关闭
Windows Sockets API提供了shutdown()和WSASendDisconnect()实现关闭连接的功能.
closesocket()实现关闭套接字的功能, 同时也隐含执行shutdown()的功能.
客户端从容关闭的过程:
- 客户端以SE_SEND为参数调用shutdown(), 意为客户端不再发送数据(但客户端还可以接受数据).
- 服务器收到FD_CLOSE, 得知客户端正在从容关闭.
- 服务器发送数据.
- 服务器以SE_SEND为参数调用shutdown(), 然后调用closesocket()关闭套接字.
- 客户端收到FD_READ, 接收服务器的数据, 然后收到FD_CLOSE.
- 客户端调用closesocket()关闭套接字.
3.3 IP定址
3.3.1 IP定址
//
A means address
//F means family
#define AF_INET 2
在Windows Sockets中, SOCKADDR_IN结构用以指定IP地址和端口号.
struct
sockaddr_in {
short
sin_family;
//
地址家族
u_short sin_port;
//
服务端口号
struct
in_addr sin_addr;
//
in_add类型的IP地址
char
sin_zero[
8
];
//
填充结构大小, 使之与SOCKADDR结构大小相同
};
sin_family必须为AF_INET, 以告知Windows Sockets应用程序使用IP地址家族.
开发Windows Sockets应用程序时, 服务端口号应选择1024~49151.
sin_addr用于把一个IP地址保存为4字节的数值.
3.3.2 字节顺序问题
htonl()和htons()实现从主机字节顺序转换为网络字节顺序的功能.
htonl = host to net long
htons = host to net short
u_long htonl(
u_long hostlong
);
u_short htons(
u_short hostshort
);
同理也有ntohl()和ntohs().
u_long ntohl(
u_long netlong
);
u_short ntohs(
u_short netshort
);