有沒有一種方法可以指導OS(WIN7)發送大數據(3MB等),使用C++套接字1個數據包?C++通過套接字在1個包中發送大數據
我的意思是沒有單獨的數據與「發送」功能將數據發送到大量的數據包:
iResult = send(ConnectSocket, &vect[0], vect.size(), 0); // Sending The File
(IM嘗試發送png文件大小3MB通過socket)。 謝謝。
有沒有一種方法可以指導OS(WIN7)發送大數據(3MB等),使用C++套接字1個數據包?C++通過套接字在1個包中發送大數據
我的意思是沒有單獨的數據與「發送」功能將數據發送到大量的數據包:
iResult = send(ConnectSocket, &vect[0], vect.size(), 0); // Sending The File
(IM嘗試發送png文件大小3MB通過socket)。 謝謝。
假設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
才能閱讀整個發送的數據。
謝謝,問題解決了。 – user2367115 2013-05-10 14:51:18
可能不是。 winsock中使用的緩衝區有其限制。在較低的(網絡)級別,TCP/IP對數據包大小有限制。
TCP是一種流傳輸,而不是數據包傳輸,並且永遠不會獲得有保證的數據包大小。此外,還有軟件和硬件實現的大小限制,方式低於您所需的大小。
如果你想發送數據包而不是流,你可以使用UDP,它有自己的缺點。而一個很大的數據包是完全不可能的。請參閱What is the largest Safe UDP Packet Size on the Internet
好的。 好吧,我嘗試了幾種解決方案,例如通過EOF char識別數據的結尾。但它不起作用。你有什麼解決方案來解決我的問題嗎? – user2367115 2013-05-10 13:58:41
很明顯,你傳輸的數量,如果首先跟隨的字節,然後有效載荷。然後,在接收端,您坐下來等待,直到您收集到承諾的數據量。 TCP非常可靠地將您發送的所有數據最終以正確的順序發送給您。 – ypnos 2013-05-10 14:14:05
這聽起來很像你需要一點「協議」。你需要一種方式來告訴另一端應該期待什麼。例如,您可以發送數據包的前四個字節(或8個字節)作爲整個傳輸的「長度」,接着是例如3MB的數據。 reciving端在「start」處接收一個包含數據長度的數據包,然後繼續獲取該傳輸所需的所有數據。一旦接收到所有數據,重新開始接收一個長度,然後循環,直到收到所有數據爲止。
你爲什麼要這樣做? – pilcrow 2013-05-10 13:43:59
我不確定你是否在這裏感到困惑。你真的是指*一個*包,還是你想知道如何通過套接字發送3MB(通過TCP?)? – Joe 2013-05-10 13:44:19
@pilcrow 因爲我在識別圖像數據的結尾時遇到了問題(因爲我想在這些數據之後發送另一個數據),而我在我的python服務器中接收數據時,所以我想我找到了一個解決方案,解決方案是分離數據在不同的數據包中發送每個數據。 – user2367115 2013-05-10 13:49:00