有没有办法引导操作系统(WIN7)在1个带C ++套接字的数据包中发送大数据(3MB等)?
我的意思是发送数据"发送"函数没有将数据分成很多数据包:
iResult = send( ConnectSocket, &vect[0], vect.size(), 0 ); // Sending The File
(我试图通过套接字发送大小为3MB的png文件)。 感谢。
答案 0 :(得分: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
才能阅读整个已发送的数据。
答案 1 :(得分:1)
可能不是。 winsock中使用的缓冲区有其限制。在较低(网络)级别,TCP / IP对数据包大小有限制。
答案 2 :(得分:1)
TCP是一种流传输,而不是数据包传输,您永远无法获得有保证的数据包大小。此外,在软件和硬件中实施了大小限制,方式低于您所需的大小。
如果要发送数据包而不是流,可以使用UDP,它有自己的缺点。一个大包完全不可能。见What is the largest Safe UDP Packet Size on the Internet
答案 3 :(得分:1)
这显然听起来像你需要一点“协议”。你需要一种方法告诉对方期待什么。例如,您可以将数据包的前四个字节(或8个字节)作为整个传输的“长度”发送,然后发送例如3MB的数据。接收方在“开始”接收包含数据长度的数据包,然后继续获取该传输所需的所有数据。收到所有数据后,通过接收长度重新开始,然后循环直到收到所有数据。