【问题标题】:How to create a buffer for reading socket data in C如何在 C 中创建用于读取套接字数据的缓冲区
【发布时间】:2010-09-13 16:12:15
【问题描述】:

使用C/C++套接字编程,以及“read(socket, buffer, BUFSIZE)”方法。 “缓冲区”到底是什么我知道 char 和 byte 是一回事,但是字节数组中有多少元素有关系吗?缓冲区是否需要能够保存整个消息直到出现空字符?

【问题讨论】:

  • 这个空字符是你的消息的发件人发送的吗?
  • 不,很遗憾我必须将它附加到预期有效负载的末尾
  • 你知道邮件的大小,还是以某种方式标记了结尾?
  • 这很好,我应该知道,因为它是作为 HTTP 标头的一部分发送的

标签: c sockets


【解决方案1】:

与往常一样,如果有机会,请使用sizeof。使用内置运算符sizeof,您要求编译器计算变量的大小,而不是自己指定。当实际变量的大小与您的想法不同时,这会降低引入错误的风险。

所以,不要这样做

#define BUFSIZE 1500
char buffer[BUFSIZE];
int n = read(sock, buffer, BUFSIZE);

你真的应该使用

char buffer[1500];
int n = read(sock, buffer, sizeof buffer);

注意你不需要在 sizeof 的参数周围加上括号,除非参数是类型的名称。

【讨论】:

  • unwind:在 C 中是这样还是仅在 C++ 中是这样? (抱歉,只有熟悉的 w/C)。
  • 您好,很抱歉在一个非常老的问题上打扰您。我面临着类似的问题,如果你能就可能导致它的原因给我你的意见,我会很高兴。提前谢谢!希望你不介意。以防万一,这是question!
【解决方案2】:

您的套接字实现不需要足够大的缓冲区来确定保存整个消息,但它可能会很方便,具体取决于您在做什么。

【讨论】:

    【解决方案3】:

    BUFSIZE 应该等于缓冲区的大小(以字节为单位)。 read() 将在缓冲区已满时停止读取。这是一个例子:

    #define MY_BUFFER_SIZE 1024
    
    char mybuffer[MY_BUFFER_SIZE];
    int nBytes = read(sck, mybuffer, MY_BUFFER_SIZE);
    

    【讨论】:

    • 谢谢,但这只是部分回答了我的问题。我想我所追求的是如果要读取的流大于缓冲区会发生什么?
    • 抱歉,措辞不是很好。我的意思是:你必须循环阅读。每次通过循环,您都会处理缓冲区中的内容(即使只是将其内容附加到字符串)。当 read() 返回 0 时循环结束。
    • CJY 是正确的,如果您从流套接字读取,即使缓冲区足够大,也必须循环执行,因为您不一定会得到所有数据一气呵成。读取已知大小的数据报可能是个例外,我不记得了。
    猜你喜欢
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多