网络编程
CS编程模型
sequenceDiagram 客户端 ->> 服务端: 请求 服务端 ->> 服务端: 处理资源 服务端 --> 客户端: 响应
网络
全球IP因特网
IP地址
IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
因特网域名
因特网连接
套接字接口
/*通用的socket地址结构 (用于connect, bind, 和accept) */ struct sockaddr { unsigned short sa_family; /* 协议家族 */ char sa_data[14]; /* 地址数据 */ }; /* 因特网形式的socket地址结构 */ struct sockaddr_in { unsigned short sin_family; /* 地址家族,一般都是AF_INET */ unsigned short sin_port; /* 网络字节顺序(大端表示法)的端口号 */ struct in_addr sin_addr; /* 网络字节顺序(大端表示法)的IP地址 */ unsigned char sin_zero[8]; /* 对sizeof(struct sockaddr)的填补 */ };
socket 函数
#include <sys/types.h>#include <sys/socket.h>int socket(int domain,int type,int protocol); // 使用此函数创建一个套接字描述符int connect(int clientfd,const struct socketaddr *addr,socklen_t addrlen); // 建立与服务端的连接int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen); // 服务器用来绑定fd与网络地址int listen(int sockfd,int backlog); // 服务器将socketfd转换为一个监听socketfd 从而接受客户端的连接请求int accept(int listenfd,struct sockaddr *addr,int *addrlen); // 返回已连接描述符
为什么需要区分监听描述符与已连接描述符 答案是为了并发 服务器端可以通过多进程或者多线程的方式处理多个已连接描述符 从而对多个用户提供服务
主机和服务的转换
#include <sys/types.h>#include <sys/socket.h>#include <netdb.h>int getaddrinfo(const char *host,const char *service, const struct addrinfo *hints, struct addrinfo **result); // 将主机名端口号等信息转换为套接字地址结构void freeaddrinfo(struct addrinfo *result);const char *gai_strerror(int errorcode);int getnameinfo(const struct sockaddr *sa,socklen_t salen, char *host,size_ hostlen, char *service,size_t servlen,int flags);