1

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

我的意思是使用“发送”功能发送数据而不将数据分离到很多数据包中:

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

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

4

4 回答 4

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多次调用才能读取整个发送的数据。

于 2013-05-10T13:53:34.030 回答
1

可能不是。winsock 中使用的缓冲区有其限制。在较低的(网络)级别,TCP/IP 对数据包大小有其限制。

于 2013-05-10T13:42:18.453 回答
1

这显然听起来像你需要一些“协议”。你需要一种方法来告诉另一端会发生什么。例如,您可以将数据包的前四个字节(或 8 个字节)作为整个传输的“长度”发送,然后发送例如 3MB 的数据。接收方在“开始”处接收到一个数据包,其中包含数据的长度,然后继续获取该传输所需的所有数据。接收完所有数据后,通过接收一个长度重新开始,然后循环直到接收到该长度的所有数据。

于 2013-05-10T14:06:29.730 回答
1

TCP 是流传输,而不是数据包传输,您永远不会得到保证的数据包大小。此外,在软件和硬件中实现了大小限制,低于您所需的大小。

如果你想发送数据包而不是流,你可以使用 UDP,它有自己的缺点。而这么大的数据包是完全不可能的。查看Internet 上最大的安全 UDP 数据包大小是多少

于 2013-05-10T13:50:08.303 回答