HTTP 服務器程序編寫過程總結
- 作者:新網
- 來源:新網
- 瀏覽:100
- 2018-05-08 11:17:09
用于從已完成連接隊列頭返回下一個已完成連接,如果已完成連接隊列為空,那么進程就會被阻塞。因此調用了accept函數之后,進程就會被阻塞,直到有新的請求到來。
第一個參數sockfd是客戶端的套接字描述符,第二個是客戶端的套接字地址結構,第三個是套接字地址結構的長度。
用于從已完成連接隊列頭返回下一個已完成連接,如果已完成連接隊列為空,那么進程就會被阻塞。因此調用了accept函數之后,進程就會被阻塞,直到有新的請求到來。
第一個參數sockfd是客戶端的套接字描述符,第二個是客戶端的套接字地址結構,第三個是套接字地址結構的長度。
如果accept成功,那么返回值是由內核自動生成的全新描述符,代表所返回的客戶端的TCP連接。
對于accept函數,第一個參數稱為監聽套接字描述符,返回值稱為已連接套接字。
服務器僅創建監聽套接字,它一直存在。已連接套接字由服務器進程接受的客戶連接創建,當服務器完成某個連接的響應后,相應的已連接套接字就被關閉了。
accept函數返回時,會返回套接字描述符或出錯指示的整數,以及引用參數中的套接字地址和該地址的大小。如果對返回值不感興趣,可以把兩個引用參數設為空。
accept之后,一個TCP連接就建立起來了,接著,服務器就接受客戶端的請求信息,然后做出響應。
recv和send函數
分別用于從客戶端讀取信息和發送信息到客戶端。在此不做過多的解釋。
套接字地址結構大小和值-結果參數
可以看到,在bind函數和accept函數里面,都有一個套接字地址結構長度的參數,區別在于一個是值形式,另一個是引用形式。套接字地址結構的傳遞方式取決于該結構的傳遞方向:是從進程到內核,還是從內核到進程。
1、從進程到內核:bind、connect、sendto。
函數將指針和指針所指內容的大小都傳給了內核,于是內核知道到底需要從進程復制多少數據進來。
2、從內核到進程:
accept、recvfrom、getsockname、getperrname。
這四個函數的結構大小是以只引用的方式傳遞。
因為當函數被調用時,結構大小是一個值,它告訴內核該結構的大小,這樣內核在寫該結構時不至于越界;當函數返回時,結構大小又是一個結果,它告訴內核在該結構中究竟存儲了多少信息。
HTTP響應報文
發送響應給客戶端時,發送的報文要遵循HTTP協議,HTTP的響應報文格式如下:
第一行status-line,狀態欄,格式:HTTP版本 狀態碼 狀態碼代表文字headers是返回報文的類型,長度等信息,接著是一個空行,然后是響應報文的實體。
一個HTTP響應報文例子:
最后close函數關閉套接字,時刻保持關閉文件描述符是一個很好的編程習慣。
以上就是我們關于HTTP服務器程序編寫的簡單介紹,希望對大家有所幫助。