C++ 在套接字编程中接收结构并写入文件

C++ 在套接字编程中接收结构并写入文件,c++,c,sockets,struct,tcp,C++,C,Sockets,Struct,Tcp,如何通过tcp套接字接收结构并输出到文件?我有一个struct,它是一个数据包,我试图通过套接字发送这个数据包,并在客户端接收它,然后写入文件。我使用一个空指针作为缓冲区来存储文件数据 到目前为止我有 struct packet { int id; void* data;}; 我可以在客户端访问id和int,但当我将数据写入文件时。文件似乎已损坏 更新: 服务器打开了一个文件,将从该文件中读取数据,并将其制成数据包,然后将数据包发送给客户端 客户机还将打开一个文件进行写入,因为

如何通过tcp套接字接收结构并输出到文件?我有一个struct,它是一个数据包,我试图通过套接字发送这个数据包,并在客户端接收它,然后写入文件。我使用一个空指针作为缓冲区来存储文件数据

到目前为止我有

struct packet {
    int id;
    void* data;};
我可以在客户端访问id和int,但当我将数据写入文件时。文件似乎已损坏

更新:

服务器打开了一个文件,将从该文件中读取数据,并将其制成数据包,然后将数据包发送给客户端

客户机还将打开一个文件进行写入,因为它接收到数据包后会将其写入文件

服务器端:

current_packet = 0;
While(1)
{
struct packet *current = (packet *)malloc(packet_size+sizeof(int));
current->id = current_packet;
int read = fread(&current->data, 1, packet_size, file);
//end of file
if(read == 0){
break;
}
int byte_write = write(conn, current,read + sizeof(int));
current_packet++;
}
客户端

current_packet = 0;
While(1)
{
struct packet *current = (packet *)malloc(packet_size+sizeof(int));
int read = read(conn, current, packet_size + sizeof(int));
//end of file
if(read == 0){
break;
}
int byte_write = fwrite(&current->data, 1, read - sizeof(int), file);
fflush(file);
}
假定的
数据包大小

 const size_t packet_size = 2048;
上面引用的代码可能会分配一些大到足以包含
数据包
,但是
数据
指针没有初始化,在分配中也没有正确考虑

在你的情况下,我会怎么做:

为每个
数据包
分配一个固定大小的缓冲区,如下所示:

struct packet {
    const size_t packet_size = 2048;
    int id;
    std::array<unsigned char,packet_size> data;
};
struct数据包{
const size\u t packet\u size=2048;
int-id;
std::数组数据;
};

当您在客户端站点接收数据时,如何知道数据的大小?将为无效指针数据分配一个以字节为单位的大小。因此,结构的总大小将是数据的大小+整数的大小。客户端和服务器都知道数据的大小。当我向客户机写入我从文件中读取的字节时,最大值可以是设置的数据大小。在客户端,我接收到结构,然后当我写入文件时,我写入读取的字节数-整数的大小。这将是数据的大小。您的意思是
id
实际上包含文件的大小?您是否正确考虑网络字节顺序传输?您的代码示例太窄,无法为您的问题提供一些简明的诊断。请提供一个。id是数据包的序列号。客户端将打开一个文件,以便按顺序写入和接收数据包,并将其写入该文件。void*包含数据。服务器读取文件并将其读取到
void*data
。最大读取量可以是数据包大小。
数据包大小
是固定的吗
void*
需要指向一些分配的内存。
struct packet {
    const size_t packet_size = 2048;
    int id;
    std::array<unsigned char,packet_size> data;
};