TCP通信数据接收栈实现

    很惭愧TCP/IP协议卷一还没有看完,实在是毅力问题。

    在使用TCP的时候一向怀疑数据是否能够完整接受,先发送一个"hello"字符串后再发送一个“world”字符串,可能就会在你不知道的时候底层开始进行包的重组,重组成

"hellowo"和"rld"两个字符串。特别是在数据发送频繁,和网络延时的时候.如果你在接受方直接recv()缓冲区所有数据的时候,这种情况尤为常见。

   我的解决方法是在程序内部使用一个栈区来解决这个问题,当每当socket缓冲区有数据的时候就将数据入栈,然后通过判断栈的长度或者栈中数据来判断是否完整接受了一次数据。如果栈中有了一个完整了发送方发送的数据(这个前提是双方协定好每次数据的固定长度)那么就将栈底的这些数据读取,然后重新排列一下栈区。  

python描述 

while True:
  ...
  ...
  receive=currentarmsocket.recv(1024)
  for i in receive:
    stack.append(i)
  if len(stack)<8:
    continue
  if len(stack)>10240:
    stack=list()
    break
  receive=stack[0:8]
  stack=stack[8:(len(stack)-8)]
  ...
  ...

上面这段代码能够很好地工作,然后保证到达地下的receive是一个完整的来自发送方发送的数据。


c语言则可以实现一个环形数组数据结构,则避免了重组栈区的开销。而且不仅用于TCP数据通信,在串口发送与接受中使用这种方式也能发挥出意想不到的效果。

 一点遗憾就是目前在底层中还没有发现有人使用这种方式去接收数据,包括一些厂家提供的示例和实际的商业代码中几乎都是直接读取串口缓冲区,对数据几乎没有什么处理,对就接受处理,错误就抛弃。

你可能感兴趣的:(socket)