从TCP套接字读取

时间:2018-10-29 21:56:15

标签: c sockets tcp server

我有客户发送非常简单形式的请求:只是字符串GET/PUT/INSERT/DELETE KEY <VALUE>,其中值是可选的,具体取决于所选关键字。

键和值的大小可以任意设置。

我正在C中实现一个服务器来处理请求,但是我认为我遇到了read()系统调用读取一些但不是全部数据的问题。也就是说,服务器读取的内容只是客户端发送的内容的一部分。

我怎么知道何时阅读完整个邮件?

示例请求: INSERT KEYkeyKEYkeyKEY VALUEvalueVALUEvalueVALUE

但是服务器可能会读取: INSERT KEYkeyKEYkeyKEY VALUEvalueVALUE

我怎么知道尚未收到并阅读整条消息?

3 个答案:

答案 0 :(得分:2)

TCP不提供任何方式。 TCP是一种面向流的协议,它所做的只是发送字节流。由您决定在该流的顶部创建有线协议,以便您可以检测消息边界。

经典方式

  • 发送固定大小的前缀并带有预期消息的大小
  • 使用自我描述编码(例如ber)
  • 发送定界符-在文本协议中说2个空行(较旧的RFC协议常见)

答案 1 :(得分:1)

  

我怎么知道尚未收到并阅读整条消息?

您需要一些惯例来了解消息的结尾。您解析您的输入。

答案 2 :(得分:1)

只是一个小提示:您正在阅读短篇小说。如前所述,通常您将添加一个固定长度的标头,其中包含消息的长度或解析消息的格式(假设接收到JSON格式的String)。您还可以切换到基于消息的协议,例如UDP或SCTP。

还请记住,理论上也可能发生长读取,即,您可以通过一次网络读取来读取两个命令(或一个命令而另一个命令的一半)。