如何从C中的套接字文件描述符读取时检测分隔符?

时间:2016-02-05 20:01:43

标签: c sockets

在C中,当从套接字文件描述符读入缓冲区时,如果检测到分隔符,如何使读取停止?我们假设分隔符是'>'字符。

<schema xmlns="http://purl.oclc.org/dsdl/schematron"
        queryBinding="exslt"
        xml:lang="en">
  <ns uri="http://www.w3.org/1999/xlink" prefix="xlink"/>
  <ns uri="http://exslt.org/regular-expressions" prefix="regexp"/>
  <pattern id="funding_info">
    <title>Make sure funding-source does not happen inside p</title>

      <assert test="regexp:test(current(), '^C.+$')">
          EC-CHECK: Nao deve haver 'funding-source' nem 'award-id' dentro de 'p'
      </assert>
    </rule>
  </pattern>
</schema>

2 个答案:

答案 0 :(得分:5)

这里有两个选项:

  • 一次读取一个字节,直到遇到分隔符。这可能效率很低。
  • 一次读入一个完整缓冲区的数据,然后在那里查找分隔符。找到它后,将剩余数据保存在另一个缓冲区中并处理所需的数据。当您准备再次读取时,将保存的数据放回缓冲区,并使用缓冲区中下一个可用字节的地址调用read

答案 1 :(得分:2)

read()函数不会检查它将数据从源传输到缓冲区的数据。您不能强制它停止传输特定字符或字符的数据(如果它不会在那里停止)。

另一方面,重要的是要认识到read()不一定读取在任何情况下指定的完整字节数。一方面,这意味着您需要准备好在循环中运行read()调用以收集您期望的所有数据,但另一方面,这意味着您通常可以期望read()已经传输了至少一个字节,然后当没有更多数据可立即传输时它将返回。因此,如果发件人在分隔符后停止发送数据,那么read()可能会在该分隔符后停止读取。

如果您不能依赖发送方根据需要分解传输,那么您可以选择一次读取一个字节。然而,这可能非常低效。更常见的解决方案是分两个阶段完成工作:(1)从内核执行快速,逐块read()到用户空间缓冲区,然后(2)通过用户空间代码解析缓冲区内容。这基本上是使用缓冲区时可读C流的作用。