webserv
1.0.0

项目在1337 Khouribga编码学校开发。
作者:@jamiafathiya&@achrafelkhnissi& @ @abellaismail7
HTTP代表超文本传输协议,该协议是用于转移超文本的协议。这提出了两个问题:什么是协议,什么是超文本?在这种情况下,协议是一个规则系统,可以实现不同实体(例如计算机)之间信息的通信。超文本是一个过时的术语,用于在计算机屏幕上显示的文本,其中包含其他文本的超链接,即,即Web文档。因此,超文本传输协议是指用于来回传输Web文档的一组规则,服务器和浏览器。
HTTP允许会话,并且在浏览器和服务器之间共享存储的状态。如果访问者正在浏览照片库,则浏览器和服务器可以通过以cookie的形式来回传递信息来交换序列中访客位置的信息。重新加载页面后,浏览器将cookie发送到服务器,指示访问的最后一个位置,从而使观看者从那时恢复。这意味着虽然HTTP无状态,但并非没有会话。
| 学期 | 定义 |
|---|---|
| 浏览器 | 用于在HTML文档之间访问和导航的应用程序。 |
| 用户代理 | 代表用户起作用的应用程序,通常是浏览器。 |
| TCP | 传输控制协议的缩写,这是万维网,电子邮件,FTP和远程管理使用的主要Internet协议之一。 |
| IP | 互联网协议的缩写。 IP用于通过网络在计算机之间传输数据。连接到Internet的每个设备都有一个IP地址。 |
| URL | 唯一的资源定位器,一个地址指向网络上的资源。 |
| DNS | 域名服务器的缩写。 DNS分类所有域名URL,并将它们指向服务器的IP地址。 |
| 资源 | 遵循URL时在服务器上可用的文件或文件。 |
| 服务器 | Internet上的一台计算机运行某种形式的数据存储和共享应用程序,最常见的是Web服务器应用程序。 |
| 代理人 | 软件或硬件服务是客户和服务器之间的中间人。 |
| 请求响应对 | 客户和服务器使用请求响应对通过HTTP进行通信。发送请求,并返回响应。 |
| 标题 | 请求和响应使用HTTP标头来回传递信息。 |
| HTTP请求方法/动词 | 每个HTTP请求都包含一种方法,也称为动词,该方法解释了发件人想要在资源上执行的操作(例如,获取,删除,删除)。 |
| 状态响应代码 | 100至500范围内的数值代码,描述了服务器发送回客户端的响应类型。 |
| 缓存 | 将数据存储在客户端或服务器上以加快性能的方法。 |
| 无状态 | HTTP是无状态的,这意味着每个请求和响应都是唯一的,也没有存储状态。 |
| 曲奇饼 | 客户端和服务器之间来回传递的一串数据来创建状态会话。 |
| 会议 | 客户和服务器可以通过来回传递信息,创建会话来共享有关状态的信息。 |


| 方法 | 描述 | 成功 | 失败 |
|---|---|---|---|
| 得到 | 获取指定的资源,如果可用 | 200好 | 404找不到 |
| 邮政 | 创建一个新资源并将其添加到集合中 | 201创建 | 401未经授权,409冲突,未发现404 |
| 放 | 更新现有的基于Singleton的资源或ID | 200好 | 401未经授权,找不到404,405方法不允许 |
| 修补 | 修改现有的基于Singleton的资源或ID | 200好 | 401未经授权,找不到404,405方法不允许 |
| 删除 | 删除基于资源的Singleton或ID(您无法删除资源集合) | 200好 | 401未经授权,未找到404 |
| 选项 | 从此资源获取可用的选项 | 200好 | - |
| 头 | 仅获取资源的响应标题 | 200好 | 404找不到 |
本节包括创建Web服务器的必要功能的描述。
int getaddrinfo ( const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); node :服务器的主机名或IP地址。
node为NULL ,则使用本地主机的IP地址。 service :服务器的端口号。
service为NULL ,则使用hints中请求的服务的默认端口号。 hints :指向struct addrinfo指针,该指定指定了选择列表中指向res列出的套接字地址结构的标准。
hints为NULL ,则返回的列表包括所有套接字类型的套接字地址,指定节点的地址家族支持的所有协议系列以及本地主机的地址。struct addrinfo的以下字段:ai_family :地址家庭。为ai_family字段定义了以下常数:AF_INET :IPv4 Internet协议AF_INET6 :IPv6 Internet协议AF_UNIX :本地通信AF_UNSPEC :未指定ai_socktype :套接字类型。为ai_socktype字段定义了以下常数:SOCK_STREAM :提供测序,可靠,基于连接的字节流。可以支持带外数据传输机制。SOCK_DGRAM :支持数据报(无连接,固定最大长度的不可靠消息)。SOCK_RAW :提供原始网络协议访问。SOCK_RDM :提供一个可靠的数据报层,不保证订购。SOCK_SEQPACKET :提供一个不能保证排序的测序数据包层。ai_protocol :套接字的协议。为ai_protocol字段定义了以下常数:IPPROTO_TCP :传输控制协议IPPROTO_UDP :用户数据报协议IPPROTO_RAW :原始协议接口IPPROTO_IP :互联网协议IPPROTO_ICMP :Internet控制消息协议IPPROTO_IGMP :Internet组管理协议IPPROTO_IPV4 :Internet协议版本4IPPROTO_IPV6 :Internet协议版本6 res :指向一个或多个struct addrinfo结构的链接列表,其中包含有关主机的响应信息。
返回值:成功时,返回零。错误时,返回-1,并且适当设置了errno 。
struct addrinfo :
struct addrinfo {
int ai_flags; // input flags
int ai_family; // socket protocol family
int ai_socktype; // socket type
int ai_protocol; // protocol for socket
socklen_t ai_addrlen; // socket address length
struct sockaddr *ai_addr; // socket address
char * ai_canonname; // service name
struct addrinfo *ai_next; // next item in the list
}; int socket ( int domain, int type, int protocol);domain :通信域指定要使用的通信语义和协议系列。为domain参数定义了以下常数:AF_INET :IPv4 Internet协议AF_INET6 :IPv6 Internet协议AF_UNIX :本地通信AF_UNSPEC :未指定type :通信语义。为type参数定义了以下常数:SOCK_STREAM :提供测序,可靠,基于连接的字节流。可以支持带外数据传输机制。SOCK_DGRAM :支持数据报(无连接,固定最大长度的不可靠消息)。SOCK_RAW :提供原始网络协议访问。SOCK_RDM :提供一个可靠的数据报层,不保证订购。SOCK_SEQPACKET :提供一个不能保证排序的测序数据包层。protocol :与套接字一起使用的协议。通常,只有一个协议来支持给定协议家族中的特定套接字类型,在这种情况下, protocol可以指定为0。为protocol参数定义了以下常数:IPPROTO_TCP :传输控制协议IPPROTO_UDP :用户数据报协议IPPROTO_SCTP :流控制传输协议IPPROTO_TIPC :透明的过程间通信IPPROTO_RAW :原始IP数据包errno 。 int bind ( int sockfd, const struct sockaddr *addr, socklen_t addrlen);sockfd :要绑定的套接字的文件描述符。addr :一个指向sockaddr结构的指针,该结构包含要绑定到插座的地址。地址的长度和格式取决于插座的地址家族。addrlen : addr参数指向的地址结构的大小,字节。errno 。 int listen ( int sockfd, int backlog);sockfd :要侦听的套接字的文件描述符。backlog : sockfd待处理连接队列的最大长度可能会增长。errno 。 int accept ( int sockfd, struct sockaddr *addr, socklen_t *addrlen);sockfd :要接受的套接字的文件描述符。addr :指向sockaddr结构的指针。该结构充满了对等插座的地址,如通信层所知。返回的地址的确切格式由插座的地址家族确定。当返回的地址太长以至于无法安装在提供的sockaddr结构中时,地址将被截断。addrlen :一个指向socklen_t对象的指针,该对象在输入上指定了所提供的sockaddr结构的长度,并在输出上指定了存储的地址的长度。errno 。 ssize_t recv ( int sockfd, void *buf, size_t len, int flags);sockfd :要接收的套接字的文件描述符。buf :指向缓冲区应存储消息的指针。len : buf参数指向的缓冲区字节的长度。flags :指定消息接收的类型。该值是由逻辑上或以下值零或更多值形成的:MSG_OOB :过程外数据。MSG_PEEK :窥视传入消息。MSG_WAITALL :等待完整的请求,除非插座不封锁。MSG_DONTWAIT :启用非块操作;如果操作会阻塞,则通话将失败,而EAGAIN或EWOULDBLOCK则失败。MSG_NOSIGNAL :在写入管道时,请勿生成SIGPIPE ,没有人可以阅读它。recv()返回0。错误时,返回-1,并且适当设置了errno 。 ssize_t send ( int sockfd, const void *buf, size_t len, int flags);sockfd :要发送的套接字的文件描述符。buf :一个指向缓冲区的指针,其中包含要发送的消息。len : buf参数指向消息字节的长度。MSG_OOB :过程外数据。MSG_DONTROUTE :旁路路由,使用直接接口。MSG_DONTWAIT :启用非块操作;如果操作会阻塞,则通话将失败,而EAGAIN或EWOULDBLOCK则失败。MSG_NOSIGNAL :在写入管道时,请勿生成SIGPIPE ,没有人可以阅读它。errno 。 一般的
HTTP请求
HTTP响应
CGI
压力测试