当前位置: 首页 > 知识库问答 >
问题:

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

贺宜修
2023-03-14

如何通过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);
}

共有1个答案

文英达
2023-03-14
struct packet *current = (packet *)malloc(packet_size+sizeof(int));

假设<code>packet_size</code>类似于

 const size_t packet_size = 2048;

上面引用的代码可能会分配足够大的东西来包含数据包,但数据指针没有初始化,并且在分配中也没有正确考虑。

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

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

struct packet {
    const size_t packet_size = 2048;
    int id;
    std::array<unsigned char,packet_size> data;
};
 类似资料:
  • 套接字地址结构 地址结构 说明 sockaddr_un UNIX通信域套接字地址 sockaddr_in IPv4套接字地址 sockaddr_in6 IPv6套接字地址 sockddr_un struct sockaddr_un { sa_familly_t sun_family; char sun_path[]; } sockaddr_in /* 在头文件<netinet/in

  • 我正在尝试用套接字从客户端向服务器写入一个结构。 结构是: 这两个程序(服务器、客户机)的结构是相同的,并且这两个程序的结构是相同的。 客户端程序: 结构R*r; 马洛克.. ...(用数据填充结构) write(socket_fd,(void*)r,size of(R)); 服务器程序: 结构R*r; 马洛克.. read(client_fd,(R*)r,size of(R)); 这不是将结构从

  • 问题内容: 我已经用套接字卡住了4h,我使用的方式是只有一个应用程序作为客户端和服务器,一旦客户端连接, 它将与新客户端一起打开theard,并等待消息。 一旦消息发送到服务器,客户端将收到响应,该部分正在正常工作。 客户专区的一部分: 服务器支持2条消息,第一条是“列表”,发送一条命令是“获取值”。 如果客户端将请求命令“列表”,它将运行以下命令:有一个“服务器/客户端”,它正在发送请求并接收一

  • 我转向你,在这件事上我一直把头撞在墙上。 我正在做一个小的socket编程,我可以看到当我把它放出来。println(“…”)while循环之前的代码行(in.readLine())它工作正常,但我需要它位于循环内部。 说清楚一点,我没有看到任何错误。我只是看不到此应用程序的客户端显示文本。它看起来好像在工作,但事实并非如此。此外,我也不控制该应用程序的客户端,它由通过TCP连接到此套接字侦听器应

  • socket_read和socket_recv之间有什么区别?我正在尝试使用PHP套接字,但使用socket_read时收到了以下警告: 请帮帮我!

  • 问题内容: 我想使用能够发送和接收文件的套接字和C / C ++语言实现在Linux上运行的客户端-服务器体系结构。有没有可以简化此任务的库?有人可以举个例子吗? 问题答案: 最可移植的解决方案是读取文件,然后以循环方式将数据写到套接字中(同样,接收文件时也采用另一种方法)。您可以在该缓冲区中分配一个缓冲区,并从该缓冲区中将其分配到您的套接字中(您也可以使用和,这是套接字特定的写入和读取数据的方式