簡體   English   中英

我應該向套接字讀取/寫入多少字節?

[英]How many bytes should I read/write to a socket?

我對應該在Unix上的C中通過套接字寫入/讀取的字節數有一些疑問。 我習慣於發送1024個字節,但是當我發送短字符串時,有時確實太多了。

我從文件中讀取了一個字符串,但我不知道該字符串有多少個字節,它每次都可以變化,可以是10、20或1000。我只能確定它小於1024。所以,當我編寫代碼,我不知道要在客戶端讀取的字節大小(在服務器上,我可以使用strlen() )。 那么,不管我從文件中讀取的字符串的長度如何,始終讀取最大字節數(在這種情況下為1024)的唯一解決方案是嗎?

例如,使用以下代碼:

read(socket,stringBuff,SIZE);

如果我想讀取10個字節的字符串,將SIZE為10而不是1024會更好嗎?

在問題代碼中,如果只讀取10個字節,則SIZE是10個字節,1,024個字節還是1,000,024個字節都沒有區別-它仍然只讀取10個字節。 唯一的區別是為它留出了多少內存,並且如果有可能接收最多1,024字節的字符串,那么無論如何您將不得不留出那么多的內存。

但是,無論您嘗試讀取多少字節,始終必須做好准備,以使read()實際讀取不同數量的字節。 尤其是在網絡上,即使您的服務器正在發送1,024字節的字符串,當您在傳輸上遇到延遲時,在客戶端調用read() ,到達的字節數也可能少於該字節數,在這種情況下,您將讀取少於1,024。

因此,您始終必須為在多個read()調用中獲得輸入的需求做好准備。 這意味着您需要知道何時讀完輸入-您不能僅依靠read()返回告訴您完成的事實。 如果您的服務器在閱讀第一個消息之前可能發送了多個消息,那么您顯然不希望依靠此消息。

您有三個主要選擇:

  1. 始終發送大小相同的消息,如有必要,可能在較小的字符串中填充零。 對於TCP流,這通常不是最佳的。 只需閱讀,直到您收到的字節數正好為止。

  2. 有某種哨兵機制可以告訴您消息何時結束。 這可能是換行符, CRLF ,空行或行上的單個點后接空行,或可能適用於您的協議的任何行。 繼續閱讀,直到收到此標記。 為了避免一次只對一個字符進行低效率的系統調用,您需要實現某種緩沖機制以使其正常工作。 如果可以確定服務器向您發送以單個'\\n'字符結尾的行,則可以使用fdopen()和標准CI / O庫。

  3. 讓您的服務器告訴您消息的大小(在初始固定長度字段中,或者從第2點開始使用相同類型的哨兵機制),然后繼續閱讀直到獲得該字節數為止。

read()系統調用將阻塞,直到它可以讀取一個或多個字節,或者直到發生錯誤為止。

它不保證它將讀取您請求的字節數! 對於TCP套接字, read()返回的返回少於您的請求是很常見的,因為它無法返回仍在網絡中傳播的字節。

因此,如果您沒有獲得所需的所有內容,則必須檢查read()的返回值,然后再次調用它以獲取更多數據,一次又一次,直到獲得所有內容為止。

暫無
暫無

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

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