c++;通过1个数据包中的套接字发送大数据 有没有办法引导OS(Wi7)发送大数据(3MB等),在1个包中用C++套接字?

c++;通过1个数据包中的套接字发送大数据 有没有办法引导OS(Wi7)发送大数据(3MB等),在1个包中用C++套接字?,c++,sockets,C++,Sockets,我的意思是使用“发送”功能发送数据,而不将数据分离为许多数据包: iResult = send( ConnectSocket, &vect[0], vect.size(), 0 ); // Sending The File (我试图通过套接字发送大小为3MB的png文件)。 谢谢。可能不会。winsock中使用的缓冲区有其限制。在较低(网络)级别,TCP/IP对数据包大小有限制。可能没有。winsock中使用的缓冲区有其限制。在较低的(网络)级别上,TCP/IP对数据包大小有限制。TC

我的意思是使用“发送”功能发送数据,而不将数据分离为许多数据包:

iResult = send( ConnectSocket, &vect[0], vect.size(), 0 ); // Sending The File
(我试图通过套接字发送大小为3MB的png文件)。
谢谢。

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

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

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


如果你想发送数据包而不是流,你可以使用UDP,但它有自己的缺点。那么大的一包是完全不可能的。请参见

TCP是一种流传输,而不是数据包传输,您将永远无法获得保证的数据包大小。此外,在软件和硬件中实施了大小限制,远低于您所需的大小


如果你想发送数据包而不是流,你可以使用UDP,但它有自己的缺点。那么大的一包是完全不可能的。请参见

如果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
来读取整个发送的数据。

如果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
来读取整个发送的数据。

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

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

你为什么要这样做?我不知道你是否感到困惑。你真的是指一个数据包,还是想知道如何通过套接字(通过TCP?)发送3MB?@pilcrow,因为我在接收python服务器时无法识别图像数据的结尾(因为我想在该数据之后发送另一个数据),所以我想我找到了一个解决方案,这个解决方案是将数据分开,在不同的包中发送每个数据。IP如何工作的整个概念是它是打包的。TCP很好地向您隐藏了这一点,但路由上的每一跳都会对它可以接受的数据包大小有自己的限制——所有这些都会相对较小。或者您是否完全控制了两个套接字之间的基础结构?如果您希望通过同一连接发送两个或多个PNG文件内容,那么您可能应该在每个数据流前面加上某种控制信息,例如PNG文件的大小。另一端将知道在文件内容结束之前要读取多少字节。为什么要这样做?我不确定您是否对此感到困惑。你真的是指一个数据包,还是想知道如何通过套接字(通过TCP?)发送3MB?@pilcrow,因为我在接收python服务器时无法识别图像数据的结尾(因为我想在该数据之后发送另一个数据),所以我想我找到了一个解决方案,这个解决方案是将数据分开,在不同的包中发送每个数据。IP如何工作的整个概念是它是打包的。TCP很好地向您隐藏了这一点,但路由上的每一跳都会对它可以接受的数据包大小有自己的限制——所有这些都会相对较小。或者您是否完全控制了两个套接字之间的基础结构?如果您希望通过同一连接发送两个或多个PNG文件内容,那么您可能应该在每个数据流前面加上某种控制信息,例如PNG文件的大小。然后,另一端将知道在文件内容结束之前要读取多少字节。O