某些数据可以在Tcp连接中分离吗?

时间:2014-07-16 14:19:00

标签: c# networking tcp

我的问题很简单。可以在tcp连接中分离一些数据(如标题所示)?例如,如果我调用MySocket.Send(Encoding.UTF8.GetBytes("this is a test!");,我可以从连接的另一端获得2个单独的接收操作,例如“this is”和“test”吗?即,可靠是多少Tcp?

2 个答案:

答案 0 :(得分:3)

TCP通常用作;不保证无论如何使“发送”和“接收”操作一对一匹配。在技​​术上有效(但不是unlikley)必须读15次,每次获得1个字节。因此,通常有两种操作模式:

  • 读取直到流的末尾(发送者在发送消息后关闭其出站套接字)
  • 添加某种框架协议
    • 对于基于文本的协议,这通常是一个标记值,例如0或行尾(无论是CR,LF,CRLF还是LFCR都取决于您!)
    • 对于二进制协议,这通常是一些明确定义格式的长度前缀,告诉您下一条消息要考虑多少字节

(但是线路模糊;例如,redis协议大致基于文本,但使用${n}\r\n{data}\r\n形式的纯文本长度前缀,其中{n}是数字字节表示为ASCII字符串,{data}是原始n字节)

答案 1 :(得分:0)

是的,它们可以作为多个部分发送。您不能假设单个发送操作将导致另一端的单个接收。

阅读“消息框架”中的stephen cleary's article了解更多信息。 this也是message framing code。和样本{{3}}