我正在做一個任務,目標是在 C 中創建一個能夠同時處理多個客戶端的基本 FTP 服務器。該主題告訴我們“明智地使用回圈緩沖區”,但我真的不明白為什么或如何?
我已經select知道什么時候可以在不阻塞的情況下讀取或寫入我的套接字,因為我不允許使用recv,send或O_NONBLOCKING.
每個連接都有一個結構,我在其中存盤與該客戶??端相關的所有內容,例如通信檔案描述符、網路資訊和緩沖區。
為什么我不能只read在我的套接字上使用一個固定大小的緩沖區,然后將此緩沖區傳遞給決議函式?
寫作也是如此:為什么我不能只dprintf對套接字做出回應?
從我的角度來看,使用回圈緩沖區會增加一層無用的復雜性,只是為了將其轉換回字串以決議命令或發回回應。
我誤解了主題嗎?我應該將命令和回應存盤為字串的回圈緩沖區,而不是存盤單個字符?
uj5u.com熱心網友回復:
為什么在 C 中讀取和寫入套接字時應該使用回圈緩沖區?
套接字介面本身并不提供使用回圈緩沖區(又稱環形緩沖區)的理由。相反,您應該查看使用套接字的應用程式的協議要求——在這種情況下是 FTP 協議。這將根據底層網路協議(FTP 的 TCP)的特性及其對套接字層行為的影響而著色。
為什么我不能只在我的套接字上使用 read 到一個固定大小的緩沖區,然后將此緩沖區傳遞給決議函式?
你當然可以不用回圈緩沖區,但這并不像你想象的那么簡單。無論如何,這不是您應該問的問題:這不是是否需要回圈緩沖區,而是它們可以提供哪些您可能無法獲得的好處。稍后再談。
此外,您當然可以擁有固定大小的回圈緩沖區——“回圈”和“固定大小”是正交特征。然而,使用回圈緩沖區來最小化或消除動態調整緩沖區大小的任何需要通常是其中的一個目標。
寫作也是如此:為什么我不能只
dprintf對套接字做出回應?
同樣,您可能可以按照您的描述進行操作。問題是你能從插入一個回圈緩沖區中獲得什么?再說一次,以后再說。
從我的角度來看,使用回圈緩沖區會增加一層無用的復雜性,只是為了將其轉換回字串以決議命令或發回回應。
我誤解了主題嗎?
您正在談論在字串之間進行翻譯,這讓我認為您確實誤解了這個主題。
我應該將命令和回應存盤為字串的回圈緩沖區,而不是存盤單個字符?
同樣,您認為“字串”在哪里出現?您為什么假設緩沖區的元素將代表(整個)訊息?
回圈緩沖區更像是一種使用普通的、平坦的、通常是固定大小的緩沖區的方式,而不是它自己的單獨資料結構。但是,涉及到一些額外的簿記資料,因此我不會與任何想將其稱為資料結構的人爭辯。
用于輸入的圓形緩沖區
回圈緩沖區有用的主要背景關系是資料以流語意(如 TCP 提供)而不是訊息語意(如 UDP 提供)到達。關于你的分配,考慮一下:當服務器讀取命令輸入時,它如何知道命令在哪里結束?我懷疑您假設您將獲得一個完整的命令 per read(),但這絕不是一個安全的假設,無論客戶端的實作如何。您可能會在每個 上獲得部分命令、多個命令或兩者兼而有之read(),您需要做好應對的準備。
因此,例如,假設您在 one 中收到一條半控制訊息read()。您可以決議和回應第一個,但您需要讀取更多資料才能對第二個采取行動。你把這些資料放在哪里?好的,你把它讀到緩沖區的末尾。如果在下read()一個訊息中,您不僅收到了訊息的其余部分,而且還收到了另一條訊息的一部分,該怎么辦?
即使您根據需要動態分配更多空間,也不能無限期地在緩沖區末尾添加資料。您可以在某個時候將未處理的資料從緩沖區的尾部移動到開頭,從而在最后打開空間,但這很昂貴,此時我們已經遠遠超出了您所想到的簡單性。(這種簡單性總是想象中的。)或者,您可以對回圈緩沖區執行讀取操作,以便從緩沖區的(邏輯)開頭消耗資料自動使空間在(邏輯)結尾可用。
用于輸出的圓形緩沖區
類似的情況也適用于面向流的網路協議的寫入端。考慮到您不能write()一次寫入任意數量的資料,并且很難提前確切知道您可以寫入多少。與控制連接相比,這更有可能在資料連接上咬你,但原則上,它適用于兩者。如果您一次只有一個客戶可以提供資料,那么您可以一直write()回圈,直到您成功傳輸所有資料,這就是您dprintf()要做的。但這可能是一種阻塞操作,因此當您同時為多個客戶端提供服務時,它會削弱您的回應能力,如果(與 FTP 一樣)每個客戶端有多個連接,甚至可能只有一個。
您需要在服務器上緩沖資料,尤其是對于資料連接,現在您遇到的問題與您在讀取端所做的幾乎相同:當您只寫入了要發送的部分資料時,以及套接字還沒有準備好讓你發送更多,你怎么辦?您可以跟蹤您在緩沖區中的位置,并盡可能發送更多片段,直到緩沖區為空。但是,您正在浪費從源檔案中讀取更多資料或緩沖更多控制回應的機會,直到您通過緩沖區作業。再一次,回圈緩沖區可以緩解這種情況,通過為您提供一個緩沖更多資料的地方,而不需要它從緩沖區的開頭開始或受到緩沖區物理結束之前的可用空間的限制。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/462590.html
