【发布时间】:2019-09-24 22:51:30
【问题描述】:
我通过 tcp/ip ssh 隧道将包含 120000 的向量从我的计算机发送到服务器。每次,我发送 250 个 double 类型的值,服务器将它们发回给我,以确保我已正确发送数据。我使用函数 read() 来接收服务器中的数据。正如我们所知,read() 不能总是一次接收所有 250 个值(250*8=2000 字节)。因此,我使用函数 memcpy() 来保存接收到的数据,直到它达到 2000 字节。但是,memcpy 只能工作一次。
例如,我发送 250 个值(2000 字节)。服务器第一次收到 1408 个字节。我使用 memcpy() 将这 1406 个字节从缓冲区保存到一个数组中。服务器第二次收到 594 个字节。我使用 memcpy() 将这 592 个字节从缓冲区保存到同一个数组中。但是,我发现第二次,memcpy() 根据从服务器发送回我的计算机的值不起作用。
服务器中的代码c++有两个目标: 1.每次接收250条数据。 2. 每次都寄回去。
#include <stdio.h>
#include <iostream>
#include<vector>
#include <math.h>
extern "C"
void useCUDA();
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
using namespace std;
int main()
{
vector<double> Y;
int lread = 250, nMu = 4, ltotal = 120000;
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(54321);
connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
double* block_buffer_input;
block_buffer_input = new double[lread];
double* block_input;
block_input = new double[lread];
double* block_buffer_output;
block_buffer_output = new double[lread];
while (Y.size() < ltotal)
{
int nbyteread = 0;
int nbytereadtimes = 0;
while (nbyteread < 8 * lread)
{
nbytereadtimes = read(sock, reinterpret_cast<char*>(block_buffer_input), lread * sizeof(double));
memcpy(block_input + nbyteread, block_buffer_input, nbytereadtimes);
if (nbytereadtimes != 8 * lread && nbytereadtimes != 0)
cout << Y.size() << ": " << nbytereadtimes << " " << block_input + nbyteread <<endl;
nbyteread += nbytereadtimes;
}
Y.insert(Y.end(), &block_input[0], &block_input[lread]);
cout << Y.size() << ": " << nbyteread << endl;
int Sp = Y.size() - lread;
for (int i = 0; i != lread; ++i)
{
block_buffer_output[i] = Y[Sp + i];
}
write(sock, (char*)block_buffer_output, lread * sizeof(double));
}
delete[] block_buffer_input;
delete[] block_input;
delete[] block_buffer_output;
close(sock);
return 0;
}
我想知道为什么第二次 memcpy() 不起作用。
【问题讨论】:
-
'Do not work' 不是问题描述,但您没有在此处对任何系统调用的结果进行错误测试。
-
因为每次我发回服务器收到的250个值,我可以在我的电脑中查看它们的值。我发现如果需要两次 read() 数据,第二次 read() 数据是不正确的。第二次 read() 数据与之前的 250 个值相同。
-
例如:前 250 个值(向量中从第 1 个元素到第 250 个元素),我都读了一遍,它们是正确的。第二个 250 个值(从向量中的第 251 个到第 500 个),我将它们全部读取了两次:176 个元素和 74 个元素。 176 个元素是正确的(从向量中的第 251 个到第 426 个)。但是,74 个元素不是。它们应该是向量中的第 427 到第 500 个元素。但现在它们是向量中的第 177 到第 250 个元素。
-
我认为这意味着 memcpy() 在第二次不起作用。
-
我不在乎你能在你的电脑上做什么。根据定义,任何不对系统调用进行错误检查的代码都是错误的。您也没有测试流结束。