【问题标题】:C++ Reading a string from socket that contains null character before the endC ++从套接字中读取一个在结束前包含空字符的字符串
【发布时间】:2017-10-16 22:10:21
【问题描述】:

我有一个接收tcp消息的socket服务器(用c++写的),这些消息是已经放气的数据。

由于放气(压缩)方法,这些消息可能包含“空”(0)字符。

数据的表示示例(字符转换为 int 并用逗号分隔):

141、208、59、10、128、80、12、68、209、222、197、72、94、94、190、 100, 55, 246, 86, 238, 31, 212, 82, 81, 50, 76, 49, 205, 169, 238, 182、31、75、114、13、73、37、158、162、90、170、171、120、90、197、 117、164、81、116、239、97、162、55、54、0、35、128、241、222、56、 1, 102, 2, 198, 0, 147, 189, 9, 6, 12, 208, 57, 128, 206, 249, 238, 236, 31, 70, 0, 227, 173, 81, 34, 192, 76, 192, 24, 96, 178, 55、131、127、204、9、0

正如您在上面的示例中看到的那样,“null”(0)表示在实际结束之前。

所以使用时:

message_size = read( client, buffer, 4096 )

读取在第一个“null”(0) 处返回。

是否可以继续阅读以便我收到整个消息?

或者这里有什么魔术可以做?

编辑:使用 Linux Centos (2.6.32-642.6.2.el6.x86_64)

【问题讨论】:

  • 当 read 返回 > 0 时,继续阅读吗?
  • 我已经尝试过您的建议 Gill Bates,但问题仍然存在。只收到消息的第一部分。
  • 如下所述,该函数不会在 NUL 上停止。
  • 您需要创建一个minimal reproducible example
  • 您是否正在使用 C 系列字符串函数将该缓冲区转换为(以 NUL 结尾的)字符串?

标签: c++ sockets


【解决方案1】:

鉴于 read() 函数不关心 NUL 字符,在我看来,您可能会将缓冲区传递给原始 C 标准字符串函数之一,该函数使用 NUL 终止的字符串。

C++ std::string 没有这个限制。

【讨论】:

    【解决方案2】:

    是否可以继续阅读以便我收到整个消息?

    是的。使用无格式输入函数。 Unformatted Input 函数不会在终止字符处停止。

    编辑:您似乎使用的是 POSIX read 函数而不是 C++ API。碰巧的是,POSIX read 也不会在终止符上停止。

    【讨论】:

    • 我认为 OP 指的是仅使用 read 做某事。
    • @GillBates std::basic_istream::read 是一个无格式输入函数。它不会在终结符处停止。
    • 我确定 op 说的是this read
    • @GillBates 不会在 NUL 字符上停止
    • @GillBates 我明白了。这个问题没有提到 POSIX 或 Linux,所以我不确定。也就是说,它也不会止步于终结者。
    【解决方案3】:

    正如@Alnitak 提到的,我使用的是 C 系列字符串函数,这就是导致奇怪行为的原因。

    我使用了 strncat()。 我现在已经通过循环读取通过读取接收到的缓冲区,然后使用 push_back() 将其附加到 std::string 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      • 2012-10-22
      • 2014-05-22
      • 1970-01-01
      • 2016-01-16
      • 2022-01-20
      相关资源
      最近更新 更多