C++ 如何避免在tcp/ip ssh隧道的数据传输中重复读取数据?

C++ 如何避免在tcp/ip ssh隧道的数据传输中重复读取数据?,c++,matlab,tcp,C++,Matlab,Tcp,我使用tcp/ip ssh隧道将一个包含120000个类型double的向量从我的计算机发送到服务器。每次我发250个号码。因此,我发送120000/250=480次。为了确保服务器正确地修改了我的数据,每次服务器收到250个号码并将其发回时。在我的电脑里,我使用Matlab。在服务器中,我使用C++。p> 我比较发送向量和接收向量。它们不一样。在一些相同的数字之后,接收向量开始重复元素,然后继续稍后显示元素。例如:发送向量:123456789,接收向量:1234567 Ynew是发送向量,Yr

我使用tcp/ip ssh隧道将一个包含120000个类型double的向量从我的计算机发送到服务器。每次我发250个号码。因此,我发送120000/250=480次。为了确保服务器正确地修改了我的数据,每次服务器收到250个号码并将其发回时。在我的电脑里,我使用Matlab。在服务器中,我使用C++。p> 我比较发送向量和接收向量。它们不一样。在一些相同的数字之后,接收向量开始重复元素,然后继续稍后显示元素。例如:发送向量:123456789,接收向量:1234567

Ynew是发送向量,Yrecieve是接收向量,matlab代码:

tcp = tcpip('127.0.0.1', 54321, 'NetworkRole', 'server');

linput=250;

set(tcp, 'OutputBufferSize', 8*linput);
set(tcp, 'InputBufferSize', 8*linput);

Yrecieve=zeros(size(Ynew));

fopen(tcp);

i=0;
while(i<length(Ynew))    
    din=Ynew(i+1:i+linput);
    while(sum(isnan(swapbytes(din)))~=0)
        din(isnan(swapbytes(din)))=din(isnan(swapbytes(din)))*1.00001;
    end
    fwrite(tcp, swapbytes(din), 'double');

    dout = fread(tcp, linput, 'double');
    Yrecieve(i+1:i+linput)=swapbytes(dout);    

    i=i+linput;
end

fclose(tcp);
tcp=tcpip('127.0.0.1',54321,'NetworkRole','server');
linput=250;
设置(tcp,'OutputBufferSize',8*linput);
设置(tcp,'InputBufferSize',8*linput);
Yrecieve=零(大小(Ynew));
fopen(tcp);
i=0;

而(i当您使用
read
时,您需要使用它的返回值来知道实际收到了多少字节。在您的代码中,您假设每次调用都会得到
lread=250
个数字

read(sock, reinterpret_cast<char*>(block_buffer_input), lread * sizeof(double));
Y.insert(Y.end(), &block_buffer_input[0], &block_buffer_input[lread]);

这只是概述基本概念,希望能有所帮助。

当您使用
read
时,您需要使用它的返回值来知道实际接收了多少字节。在您的代码中,您假设每次调用都会得到
lread=250
个数字

read(sock, reinterpret_cast<char*>(block_buffer_input), lread * sizeof(double));
Y.insert(Y.end(), &block_buffer_input[0], &block_buffer_input[lread]);

这只是概述基本思想,希望能有所帮助。

while(Y.size()==yllength)
?为什么会出现这种情况?使用tcp,您永远无法确保一次获取所有数据,但您必须读取所获取的数据并继续,直到获得所有数据。是的,您是对的。但我将其更改为while(Y.size()!=yllength+lread),我仍然无法得到相同的向量。我没有声称您可以通过添加
来解决您的问题。我只是注意到这是我不理解的。还有
(Y.size!=yllength+lread)
是我不理解的一种情况。您必须查看从
read
返回的值,否则您没有机会以有意义的方式解释接收到的数据
lread
是您希望读取的(是吗?),但当前您忽略了每次实际读取的字节数,我发送lread=250个数字。如果它不将250个数字放入向量Y中,则无法继续下一个循环。
while(Y.size()==yllength)
?为什么会出现这种情况?使用tcp,您永远无法确保一次获取所有数据,但您必须读取所获取的数据并继续,直到获取所有数据。是的,您是对的。但我将其更改为while(Y.size()!=Ylength+lread),我仍然无法得到相同的向量。我没有声称您可以通过添加
来解决您的问题。我只是注意到这是我不理解的。还有
(Y.size!=yllength+lread)
是我不理解的一种情况。您必须查看从
read
返回的值,否则您没有机会以有意义的方式解释接收到的数据
lread
是您希望读取的(是吗?),但当前您忽略了每次实际读取的字节数,我发送lread=250个数字。如果它不将250个数字放入向量Y中,它将无法继续下一个循环。@我意识到代码是错误的。请参阅编辑以获取修复之前的一个是您基本想法的概要。我已经知道了您想要说的内容。它是很高兴你为向量Y的插入添加了这个部分。非常感谢。对不起,我有另一个问题,是关于完成这个包的。如果你有空,请回答这个问题()@TomY好吧,我意识到代码是错误的。请参见修改前一个是你基本想法的概要。我已经知道你想说的。你真的很高兴为向量Y的插入添加了部分。非常感谢。对不起,在相同的背景下,我还有另一个问题,但是关于完成程序包。如果你有空的话,请你回答这个问题()
size_t bytes_expected = xy;
size_t bytes_read = 0;
while (bytes_read < bytes_expected) {        
   auto r = read(sock,buffer,bytes_expected);  // last parameter is just the maximum, but less might be read
   // copy only that part of the buffer that contains valid data
   Y.insert(Y.end(),buffer.begin(),buffer.begin()+r);
   bytes_read += r;
}