【问题标题】:Concatenated strings that end with \0 in C在 C 中以 \0 结尾的连接字符串
【发布时间】:2015-06-10 06:51:43
【问题描述】:

有没有办法在 C 中连接字符串,它们之间用符号 \0 分隔?

例如。我正在创建一个由客户端(Java)和服务器(C)组成的简单程序。 java 客户端发送一条消息,其中包含两个“部分”,操作(例如,REGISTER)和参数(用户名)。然后,服务器必须识别操作和参数并进行一些操作。

问题是,操作和参数(两个字符串)都必须以 \0 符号结尾,但是这样做会使服务器只识别操作(因为当它接收到来自客户端的消息时,当它找到 \0 符号时停止读取)。

有没有办法从客户端接收消息为 "OPERATION\0PARAMETER\0" 并识别 OPERATION 字符串和 PARAMETER 字符串?

PD:我正在使用 TCP 套接字实现这个程序,并且在客户端我使用 printwriter 发送消息。

PD2:消息不能超过 256 字节

提前致谢

【问题讨论】:

  • 要将字符串拆分为标记,通常使用strtok
  • 你真的在问如何在 C 字符串中允许 \0 吗?
  • 您可以使用这样的字符串“abcdef\0rtyuo\0\0”(注意末尾的 2 个零),然后在收到 2 个连续的零时停止服务器并删除最后一个零字节.
  • 确保也发送了总字符串长度。可能在数据本身之前。如果您知道消息不能超过 256 个字节,则可以将长度调整为一个字节。
  • 请注意,Java 默认使用 UTF-16 进行字符串编码。

标签: java c sockets tcp


【解决方案1】:

继续调用recv(在缓冲区中累积数据)直到您收到的数据包含两个零字节。完成后,解析接收到的数据以提取两个字符串。

  1. 清空缓冲区。

  2. 调用recv 将(更多)数据读入缓冲区。

  3. 计算缓冲区已使用部分中的零字节数。如果小于 2,则转到第 2 步。

  4. 从缓冲区中提取两个字符串。一个从缓冲区的开头开始。另一个在第一个零字节之后开始。

【讨论】:

    猜你喜欢
    • 2019-02-22
    • 2010-12-23
    • 2012-06-12
    • 2013-05-24
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    相关资源
    最近更新 更多