c ++通过套接字在1个数据包中发送大数据

时间:2013-05-10 13:36:38

标签: c++ sockets

有没有办法引导操作系统(WIN7)在1个带C ++套接字的数据包中发送大数据(3MB等)?

我的意思是发送数据"发送"函数没有将数据分成很多数据包:

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

(我试图通过套接字发送大小为3MB的png文件)。 感谢。

4 个答案:

答案 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的数据。接收方在“开始”接收包含数据长度的数据包,然后继续获取该传输所需的所有数据。收到所有数据后,通过接收长度重新开始,然后循环直到收到所有数据。