簡體   English   中英

Linux中的套接字-我如何知道客戶端已完成?

[英]Sockets in Linux - how do I know the client has finished?

我目前正在嘗試使用C ++實現我自己的Web服務器-不是用於生產用途,而是用於學習。

我基本上是打開一個套接字,偵聽,等待連接,然后打開一個新的套接字,從中讀取客戶端發送的數據。 到現在為止還挺好。 但是我怎么知道客戶端已經完成了數據發送,而不僅僅是因為其他原因暫時停止發送更多數據?

我當前的示例:客戶端發送POST請求時,它首先發送標頭,然后連續兩次發送“ \\ r \\ n”,然后發送請求正文。 有時主體不包含任何數據。 因此,如果客戶端在發送標頭后暫時無法發送任何內容-我怎么知道它的請求尚未完成?

這是否僅取決於所使用的協議(HTTP),並且我的任務是根據我收到的數據找出答案,或者是否存在套接字的EOF之類的東西?

如果我無法從套接字獲取必要的信息,那么如何保護我的程序免受錯誤客戶端的侵害? (我想無論如何我都必須這樣做,因為它可能是攻擊者,而不是錯誤的客戶端發送錯誤的數據。)我唯一的選擇是繼續讀取,直到通過協議定義或超時(由我)到達?

我希望這是有道理的。

順便說一句:請不要告訴我使用一些庫-我想學習基礎知識。

“這是否僅取決於所使用的協議(HTTP),這是我的任務,根據我收到的數據找出來,”

正確。 您可以通過google找到HTTP規范; http://www.w3.org/Protocols/rfc2616/rfc2616.html

“或者是否有套接字的EOF之類的東西?”

它的行為就像一個文件……但是在這里不適用,因為客戶端沒有關閉連接。 您正在通過該連接發送回復。

協議(HTTP)會告訴您客戶端何時停止發送數據。 您無法從套接字獲取信息,因為客戶端將使其保持打開狀態以等待響應。

如您所說,您必須防止錯誤的客戶未發送適當的請求。 通常,在請求不完整的情況下,超時將應用於讀取。 如果您在30秒鍾內仍未收到任何信息,請關閉插座並忽略它。

對於HTTP帖子,應該有一個標頭(Content-Length),標明在標頭結束后需要多少字節。 如果它是POST,並且沒有Content-Length,則拒絕它。

使用基於文本的協議(如HTTP),您將受客戶端的左右。 格式最完善的POST將具有內容長度,因此您知道要發送多少數據。 但是,客戶端可能會延遲發送數據,或者它的以太網電纜可能已拔出或掛起,在這種情況下,套接字會無限期地坐在那里。 如果斷開良好,則您將從recv()獲得套接字關閉事件/響應。

在這種情況下,大多數設計良好的服務器都會有一個接收超時,並且如果套接字空閑超過30秒,它將關閉該套接字,因此不會因客戶端行為不當而浪費資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM