网络编程
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);