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
壓力測試