gpt4 book ai didi

c - 如何读取缓冲区中保留内容的缓冲区?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:17 25 4
gpt4 key购买 nike

我需要跨服务器发送文件,但我需要在前面加上 header在响应中。我不确定如何解决这个问题,因为我可以将文件读入缓冲区并使用以下代码一次发送一个缓冲区:

while ((nread = read(in, buffer, sizeof(buffer))) > 0) {
void *p = buffer;
while (nread > 0) {
int nwritten = write(csfd, p, nread);
if (nwritten <= 0) {
perror("error while sending the file to the client");
close(in);
close(csfd);
}
nread -= nwritten;
p += nwritten;
}
}
close(in);
close(csfd);

但是由于我需要发送 header ,所以我需要能够将第一 block 数据发送为 <HEADER>\r\n<DATA-1/33>随后对套接字的写入应该类似于 <DATA-2/33> , <DATA-3/33> , <DATA-4/33>等等。

因此,假设我在 char header[] = "FOUND 43199 29-33\r\n" 中有一个 header ,如何将其与文件中的第一 block 数据一起发送?

也许我可以在复制 header 后从数组中较晚的位置开始读取缓冲区?或者也许有更好的方法?

最佳答案

我建议使用压缩结构或带有负载部分的大缓冲区:

+------------------------------------+  
| |
| +----------+----------+--------+ |
| | Header | Payload | Footer | |
| +----------+----------+--------+ |
| transmit buffer |
+------------------------------------+

您将发送传输缓冲区,但您可以更改 header 、有效负载或页脚,而无需更改发送传输缓冲区的代码。

编辑 1:实现
一种实现方法是使用结构:

struct Transmit_Buffer
{
Header m_header;
uint8_t m_payload[PAYLOAD_CAPACITY];
Footer m_footer;
};

另一种实现是作为字节数组 (uint8_t):

uint8_t transmit_buffer[HEADER_SIZE + PAYLOAD_CAPACITY + FOOTER_SIZE];

并且您可以通过索引引用这些部分:

const unsigned int header_index = 0U;
const unsigned int payload_begin = header_index + HEADER_SIZE;
const unsigned int footer_begin = payload_begin + PAYLOAD_CAPACITY;

使用结构将是:

Transmit_Buffer buffer;
Send_Data((uint8_t *) &buffer, sizeof(Transmit_Buffer));

使用数组:

Send_Data(&transmit_buffer[0], sizeof(transmit_buffer));

要更改负载,您只需访问负载部分:

uint8_t * p_payload = &transmit_buffer[payload_begin];

或者

buffer.m_payload

在这个设计中,传输函数不关心缓冲区中有什么,它的目的是传输数据。

您可以添加另一个层来创建页眉和页 footer 分,然后传输数据。在这种情况下,负载无关紧要,因为它只是普通、乏味的数据。

因此,如果页眉和页脚相同,您将编写有效负载部分,然后传输缓冲区。

关于c - 如何读取缓冲区中保留内容的缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30599795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com