从缓冲区发送消息时,缓冲区会自动清除吗?

Posted

技术标签:

【中文标题】从缓冲区发送消息时,缓冲区会自动清除吗?【英文标题】:when sending a message from the buffer is the buffer automatically cleared? 【发布时间】:2021-06-05 02:59:25 【问题描述】:

我正在尝试为套接字编写代码,我首先读取 stdin 并发送到套接字,然后从所述套接字读取以发送到 stdout 到目前为止,我有一些看起来或多或少像的东西这个(在你攻击我之前我也不知道我为什么要这样做):

void read_write(int socket_descriptor_file)
    int n = 1;
    char buffer_in[1024];


    while(n>0)
        n = fread(&buffer_in,sizeof(buffer_in),1, stdin);
        if(n==0) break;

        ssize_t sent_status = send(socket_description_file, buffer_in, sizeof(buffer_in), 0);

        if(sent_status == -1)
            printf("nothing sent");
        

        ssize_t receive_status = recv(socket_descriptor_file,buffer_in,sizeof(buffer_in), 0);
        if(receive_status == -1)
            printf("nothing received ");
        
        
        fwrite(&buffer_in,sizeof (char), sizeof(buffer_in), stdout); 
        fflush(stdout);

        


    

我不确定应用发送函数时是否会自动清除上述缓冲区,以便我可以使用缓冲区存储来自recv 函数的消息。

这段代码的目的是模拟主机 1 和主机 2 之间的聊天。因此需要立即发送处理消息。

我显然也应该使用 poll 功能,但我真的不知道如何使用它。

我对这个主题不是很了解,所以如果我的代码有任何进一步的问题,请告诉我。我很高兴听到他们的声音:)

【问题讨论】:

您传递给send 的数组只是内存中的字节。它没有被清除; send 不会擦除它或将其元素设置为零,也没有必要这样做。 send 也不会保留地址并在将程序控制权返回给您后继续使用它。您可以在内存中为 recv 使用相同的字节。 【参考方案1】:

缓冲区只是内存。并且在成功调用发送内容后不再需要。所以可以重用recv的缓冲区。可能您希望将接收到的字节数 (reveive_status) 存储到文件中,而不是缓冲区的大小。

【讨论】:

以上是关于从缓冲区发送消息时,缓冲区会自动清除吗?的主要内容,如果未能解决你的问题,请参考以下文章

与 JSON 相比,作为协议缓冲区发送时消息的大小如何减小

kafka08-生产者

Kafka十四发送消息的缓冲区机制

将协议缓冲区编码的消息从 Python 服务器发送到 Java 客户端

MQTT-QoS与协议流程

发送字符串时提升消息队列崩溃