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