我正在開發一個客戶端 - 服務器項目,並且需要實現一個邏輯,我需要通過TCP套接字連接檢查是否收到最後一個數據,然後才能繼續。 爲了確保我收到了所有的數據,我計劃在發送的最後一個數據包中加上一個標誌。我在下面有兩個選項,還有相關的概率。通過TCP填充數據
i。如下所示使用一個結構體,併爲最後發送的數據包填充vst_pad,並在recv端檢查它是否存在。在方案二的優勢在於,我沒有刪除從實際數據中的標誌將其寫入到file.Just之前檢查結構
typedef struct
{
/* String holding padding for last packet when socket is changed */
char vst_pad[10];
/* Pointer to data being transmitted */
char *vst_data;
//unsigned char vst_data[1];
} st_packetData;
問題是我必須序列的結構上的第一個成員每次發送呼叫。此外,我不確定是否會在一次recv調用中通過TCP接收整個結構,因此每次都必須添加邏輯/開銷以檢查它。到目前爲止,我已經實現了這一點,但後來發現基於流的TCP可能無法保證在一次調用中收回整個結構體。
ii。使用像strncat這樣的函數將該標誌添加到最後發送的數據。
問題是我必須檢查每個接收調用或者使用正則表達式函數或像strstr函數那樣的標誌的存在,如果必須從數據中刪除它。
此應用程序將用於大數據傳輸,因此希望在每次發送/接收/讀取/寫入呼叫時增加最小開銷。真的很感激知道是否有更好的選擇,然後上述兩個或任何其他選項來檢查收到的最後一個數據包。該程序是多線程的。
編輯:我不知道我要發送的文件的總大小,但我發送的是固定數量的數據。這是fgets讀取,直到大小指定爲-1或直到遇到新行。
Alan:我不知道我要發送的文件的總大小,但是我發送的是固定數量的數據。也就是說,fgets會讀取,直到大小指定爲-1或直到遇到新行。我可以在緩衝區上使用strlen來查找實際的數據長度。 – user369823 2012-02-27 01:16:24
,當然你必須解析這4個字節,這些字節可能會在4個不同的recv呼叫中到達。 – bew 2012-02-27 16:08:12
@Alan:Thnx爲答覆到目前爲止。我部分實現了你的建議,但我想知道我到底知道了些什麼大小要放在標題中。我正在使用fgets讀取文件中的數據,並傳輸相同數量的大小。但是作爲它的TCP,我不確定發送數據的大小,直到檢查發送呼叫的返回值爲止。我有點困惑於此。一個僞代碼將是非常有用的... – user369823 2012-06-03 03:10:00