【问题标题】:Receiving a Struct and Writing to file in socket programming在套接字编程中接收结构并写入文件
【发布时间】:2015-07-04 07:36:52
【问题描述】:

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

目前为止

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);
}

【问题讨论】:

  • 当您在客户站点收到data 时,您是如何知道它的大小的?
  • 空指针数据将被分配一个字节大小。所以结构的总大小将是数据的大小 + int 的大小。客户端和服务器都知道数据大小。当我写入客户端时,我写入从文件读取的字节,最大值可以是数据的设定大小。在客户端我收到结构然后当我写入文件时,我写入读取的字节数 - int 的大小。这将是数据的大小
  • 所以你的意思是id实际上包含了文件的大小?您是否正在正确考虑网络字节顺序传输?您的代码示例太窄,无法为您的问题提供一些简明的诊断。请提供MCVE
  • id 是数据包的序号。客户端会打开一个文件依次写入和接收数据包,并将其写入文件。 void* 包含数据。服务器确实会读取文件并将其读取到void * data。最大读取可以是数据包大小。
  • packet_size 是固定的吗? void* 需要指向一些分配的内存。

标签: c++ c sockets struct tcp


【解决方案1】:
struct packet *current = (packet *)malloc(packet_size+sizeof(int));

假设packet_size 类似于

 const size_t packet_size = 2048;

上面引用的代码可能分配了足够大的东西以包含 packet,但 data 指针未初始化,并且在分配中也未正确考虑。

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

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

struct packet {
    const size_t packet_size = 2048;
    int id;
    std::array<unsigned char,packet_size> data;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多