C++通过套接字在1个包中发送大数据
有没有一种方法可以指导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