如何知道memcpy()函数在完成餐具期间已成功复制了内存



我通过TCP/IP SSH隧道将包含120000的向量发送到服务器。每次,我都会发送250个型号的值,并将其发送给我,以确保我正确发送了数据。我使用读取((函数来收到服务器中的数据。如我们所知,Read((不能始终一次收到所有250个值(250*8 = 2000 bytes(。因此,我使用函数memcpy((保存收到的数据,直到达到2000字节。但是,memcpy只能工作一次。

例如,我发送250个值(2000 bytes(。服务器第一次收回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((在第二次不工作。

如果将nbyteread添加到指针中,您实际上是指nbyteread * sizeof(double((double(的地址(nbyteread element的地址(

>
memcpy(block_input + nbyteread, block_buffer_input, nbytereadtimes);

最新更新