将数据写入以2帧发送的套接字

时间:2013-03-22 10:47:06

标签: c linux sockets tcp

我的appliactions使用socket小消息通过电线发送。每条消息大约200字节的数据。我希望看到我的数据以2帧而不是1帧发送。我的问题是

  1. 如何做到这一点,即有没有办法让TCP自动将缓冲区分成2帧?
  2. 如果我在两次单独的写入中发送缓冲区,我会得到相同的吗?
  3. 我正在使用Linux和C.

2 个答案:

答案 0 :(得分:5)

  

如何做到这一点,即有没有办法让TCP自动拆分   2帧的缓冲区?

TCP是一种流通信协议,所有数据都是连续的。您应该按分隔符拆分数据。

例如,在HTTP协议中,每个分离的请求被两个\n分割。

  

如果我通过两次单独的写入发送缓冲区,我会得到相同的结果吗?

不,您将收到它们作为一个连续的数据流。框架毫无意义。

注意:在应用程序中收到任何数据TCP之前,数据包是分开的,但操作系统会收集并重新组合它们。此过程对您的应用程序是透明的。

答案 1 :(得分:0)

以下是您可以考虑的一些事项。

  1. TCP确实有PSH flag,您可以在数据包中设置,这会使TCP推出任何缓冲数据。但这有点不可靠,因为理论上,数据可以在接收方再次组合。但实际上,您会看到数据是单独交付的。
  2. 您无法真正使用“\ n”作为分隔符,因为它可能会自然地出现在您的数据中。您必须提出某种转义序列才能使用,并转义数据中出现的所有“\ n”。这可能很痛苦。
  3. 如果需要消息边界,请考虑支持它的协议。像UDP一样。但是使用UDP,您将失去保证交付。您将不得不滚动自己的确认,重试以及不会。
  4. 最后有SCTP。较少使用的协议,但至少在Linux堆栈中可用。它为您提供两全其美的体验。消息边界,保证交付,保证顺序。