网络编程

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);

WEB服务器

WEB内容

批注 2019-07-20 091829