客户端服务器端通信流程

Pasted image 20241025183053.png

Socket编程API

转换函数

  • 用于本地端口和IP地址和网络中的端口和IP地址的转换函数:
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
  • 其中IP地址是32为无符号的整型变量,端口号是16位无符号的整型变量
  • 用于网络的IP地址和点分十进制的转换函数:
const char *inet_ntop(int af, const void *restrict src,
                             char dst[restrict .size], socklen_t size);

int inet_pton(int af, const char *restrict src, void *restrict dst);
  • 前者用于将32位的IP地址转换为点分十进制的,后者用于将点分十进制的IP地址转换为网络中可用的IP地址

通信过程中使用的API

  • Socket函数: 用于获取某一个sockfd,这一个sockfd也就是监听文件描述符号:
int socket(int domain, int type, int protocol);
  • Bind函数: 用于将端口号和IP地址绑定到某一个给定的fd上面
int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);

  • 其中需要的struct sockaddr_in结构体(其中可以使用INADDR_ANY)获取到本机任意有效的IP地址:
struct sockaddr_in {
           sa_family_t     sin_family;     /* AF_INET */
           in_port_t       sin_port;       /* Port number */
           struct in_addr  sin_addr;       /* IPv4 address */
};
  • Listen函数: 用于绑定最大等待连接队列中的最大元素个数
int listen(int sockfd, int backlog);
  • Accept函数: 用于连接到客户端,获取connfd
int accept(int sockfd, struct sockaddr *_Nullable restrict addr,
                  socklen_t *_Nullable restrict addrlen);
  • Connect函数: 用于向服务器端发送连接请求:
 int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);

例程