簡體   English   中英

從TCP套接字讀取

[英]Reading From a TCP Socket

我有客戶發送非常簡單形式的請求:只是字符串GET/PUT/INSERT/DELETE KEY <VALUE> ,其中值是可選的,具體取決於所選的關鍵字。

鍵和值的大小可以任意設置。

我正在C中實現一個服務器來處理請求,但是我認為我遇到了read()系統調用讀取一些但不是全部數據的問題。 也就是說,服務器讀取的內容只是客戶端發送的內容的一部分。

我怎么知道何時閱讀了整個消息?

示例請求: INSERT KEYkeyKEYkeyKEY VALUEvalueVALUEvalueVALUE

但是服務器可能讀取: INSERT KEYkeyKEYkeyKEY VALUEvalueVALUE

我怎么知道尚未收到並閱讀整個消息?

TCP不提供任何方式。 TCP是一種面向流的協議,它所做的只是發送字節流。 由您決定在該流的頂部創建有線協議,以便您可以檢測消息邊界。

經典方式

  • 發送帶有預期消息大小的固定大小前綴
  • 使用自我描述編碼(例如ber)
  • 發送定界符-在文本協議中說2個空行(較舊的RFC協議常見)

我怎么知道尚未收到並閱讀整個消息?

您需要一些約定來知道消息在哪里結束。 您解析您的輸入。

只是一個小提示:您正在閱讀短篇小說。 如前所述,通常您將添加一個固定長度的標頭,其中包含消息的長度或解析消息的格式(假設接收到JSON格式的String)。 您還可以切換到基於消息的協議,例如UDP或SCTP。

另外請記住,理論上也可能會發生長時間讀取,即,您可以通過一次網絡讀取來讀取兩個命令(或者一個命令,另一個命令的一半)。

暫無
暫無

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

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