簡體   English   中英

通過套接字(TCP,C ++)發送信息的時間安排

[英]Timing of information sending via socket (TCP, C++)

我正在使用在客戶端和服務器之間使用TCP通信的C ++程序。 在程序中的某個點上,存在一個循環,在該循環中,服務器向客戶端發送大小為x的序列化對象object1,然后向客戶端發送大小為y的序列化對象object2。 客戶端具有一個帶有兩個順序recv()調用的循環,以接收這些對象。

問題在於,有時客戶端中的第一個recv()接收大小為(x + y)的對象,即服務器在客戶端甚至開始等待object1之前就發送了兩個對象。 如何預防呢?

描述的問題是TCP流性質的影響。 這意味着TCP協議不關心消息邊界。 因此,您需要添加它們。

一種可能的解決方案是在通過連接發送的任何對象之前添加標頭。 例如:

x <object1> y <object2>

其中x和y是32位數字。 當您從連接讀取數據時,第一步是讀取sizeof對象,然后讀取對象本身。

此解決方案比消息確認方法好得多,因為發件人不必等待發送第二個對象。

您可能還想知道一個注意事項:在網絡協議中,您需要注意整數的字節順序。 您可能會在此處看到詳細信息。

如果客戶端僅成功接收到object1,則僅發送object2即可避免這種情況。

如果客戶端成功獲得1個對象,則客戶端將回答您的服務器,然后您的服務器可以發送下一個對象。 您可以通過創建客戶端和服務器知道的一些電報來做到這一點。

暫無
暫無

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

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