3.2  协议特征

3.2.5  从容关闭

Windows Sockets API提供了shutdown()和WSASendDisconnect()实现关闭连接的功能.

closesocket()实现关闭套接字的功能, 同时也隐含执行shutdown()的功能.

客户端从容关闭的过程:

  1. 客户端以SE_SEND为参数调用shutdown(), 意为客户端不再发送数据(但客户端还可以接受数据).
  2. 服务器收到FD_CLOSE, 得知客户端正在从容关闭.
  3. 服务器发送数据.
  4. 服务器以SE_SEND为参数调用shutdown(), 然后调用closesocket()关闭套接字.
  5. 客户端收到FD_READ, 接收服务器的数据, 然后收到FD_CLOSE.
  6. 客户端调用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
);