2013-05-10 146 views
1

有沒有一種方法可以指導OS(WIN7)發送大數據(3MB等),使用C++套接字1個數據包?C++通過套接字在1個包中發送大數據

我的意思是沒有單獨的數據與「發送」功能將數據發送到大量的數據包:

iResult = send(ConnectSocket, &vect[0], vect.size(), 0); // Sending The File 

(IM嘗試發送png文件大小3MB通過socket)。 謝謝。

+0

你爲什麼要這樣做? – pilcrow 2013-05-10 13:43:59

+0

我不確定你是否在這裏感到困惑。你真的是指*一個*包,還是你想知道如何通過套接字發送3MB(通過TCP?)? – Joe 2013-05-10 13:44:19

+0

@pilcrow 因爲我在識別圖像數據的結尾時遇到了問題(因爲我想在這些數據之後發送另一個數據),而我在我的python服務器中接收數據時,所以我想我找到了一個解決方案,解決方案是分離數據在不同的數據包中發送每個數據。 – user2367115 2013-05-10 13:49:00

回答

3

假設IP數據包的長度字段爲2個字節,您的信息流將被分解成最多65k的信息包。但是由於TCP是一個流協議,因此它將如何實現數據包的格式化和發送。您只能保證以您發送的訂單獲取您發送的數據。

如果您想知道發送數據的末尾在哪裏,請考慮先發送數據大小然後再讀取該數據量。

unsigned int len = vect.size(); 
iResult = send(ConnectSocket, &len, sizeof(len), 0); // Sending The Length 
iResult = send(ConnectSocket, &vect[0], vect.size(), 0); // Sending The File 
然後在接收端

unsigned int len; 
iResult = recv(socket, &len, sizeof(len), 0); 
// now you know how much data to read to get your png 

另外請注意,你應該檢查每個調用send期間有多少發,因爲它不必將整個緩衝區在一個單一的電話。與recv一樣。您可能需要多次撥打recv才能閱讀整個發送的數據。

+0

謝謝,問題解決了。 – user2367115 2013-05-10 14:51:18

1

可能不是。 winsock中使用的緩衝區有其限制。在較低的(網絡)級別,TCP/IP對數據包大小有限制。

1

TCP是一種流傳輸,而不是數據包傳輸,並且永遠不會獲得有保證的數據包大小。此外,還有軟件和硬件實現的大小限制,方式低於您所需的大小。

如果你想發送數據包而不是流,你可以使用UDP,它有自己的缺點。而一個很大的數據包是完全不可能的。請參閱What is the largest Safe UDP Packet Size on the Internet

+0

好的。 好吧,我嘗試了幾種解決方案,例如通過EOF char識別數據的結尾。但它不起作用。你有什麼解決方案來解決我的問題嗎? – user2367115 2013-05-10 13:58:41

+0

很明顯,你傳輸的數量,如果首先跟隨的字節,然後有效載荷。然後,在接收端,您坐下來等待,直到您收集到承諾的數據量。 TCP非常可靠地將您發送的所有數據最終以正確的順序發送給您。 – ypnos 2013-05-10 14:14:05

1

這聽起來很像你需要一點「協議」。你需要一種方式來告訴另一端應該期待什麼。例如,您可以發送數據包的前四個字節(或8個字節)作爲整個傳輸的「長度」,接着是例如3MB的數據。 reciving端在「start」處接收一個包含數據長度的數據包,然後繼續獲取該傳輸所需的所有數據。一旦接收到所有數據,重新開始接收一個長度,然後循環,直到收到所有數據爲止。