2013-05-10 104 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”处接收一个包含数据长度的数据包,然后继续获取该传输所需的所有数据。一旦接收到所有数据,重新开始接收一个长度,然后循环,直到收到所有数据为止。