【问题标题】:read long message from client从客户端读取长消息
【发布时间】:2020-04-06 03:50:14
【问题描述】:

我正在尝试从客户端读取一条长消息然后打印到服务器stdout,但是当我运行代码时,从客户端读取的数据长度几乎每次都不同......

我也尝试过使用malloc,但结果是一样的。我真的很想知道为什么......

客户端代码做得很好,问题似乎出在服务器端。

以下是代码的相关部分:

char buf[MAX];    //MAX=1024;
memset(buf, '\0', sizeof(buf));
size_t b;

while ((b = read(connect_fd, buf, MAX - 1)) > 0) {
    buf[b] = '\0';
    printf("%s", buf);
    flush(stdout);
    write(coonect_fd, buf, strlen(buf));
    memset(buf, '\0', MAX);
}

【问题讨论】:

  • TCP 级别没有数据包(或消息)。有一个字节流。在情况允许的情况下,您将从内核中读取尽可能多的字节。由您的应用程序将字节流拆分为消息。基本上在消息的开头(序列化结构)你会放置一些 ID 和长度。在接收端,您可以预先分配所需的内存量(根据 ID/长度)以在多次顺序读取中接收对象。顺便说一句,你不需要memset
  • 文档中没有任何地方说read() 填充了缓冲区。
  • 如何放置ID和长度...?

标签: sockets network-programming malloc buffer


【解决方案1】:

这个读取循环似乎没问题,可能在其他地方存在问题,在服务器代码或客户端代码中。以下是一些潜在问题的提示:

  • 无需使用memset() 清除数组。
  • b 应定义为 ssize_t 以检测 read 错误并在 read() 返回 -1 时避免未定义的行为。
  • 不需要设置空终止符:您可以使用printf("%.*s", (int)b, buf);fwrite(buf, 1, b, stdout);
  • 写入coonect_fd 时,请使用b 而不是strlen(buf)
  • 确保客户端将其输出刷新到套接字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-18
    • 2014-01-17
    • 2015-10-08
    • 2020-04-17
    • 1970-01-01
    • 2013-01-28
    • 2017-04-30
    • 1970-01-01
    相关资源
    最近更新 更多