日期:2014-05-18  浏览次数:20881 次

关于异步socket下TCP数据完整的问题。答对马上给分。
上次也问了。不过朋友们说的是我知道的保证数据完整的方法。
 如下:
 1.加标识
 2.发送消息长度的消息头
 3.固定长度。
我可能没表达清楚.
如果是同步(阻塞)我可以在那个套接字上一直读取,比如用每二种方法

string read()
{
 return string;//读取到后返回
}
//变量
string strCurrent;
在另一个函数中
function another
{
 while(1)
 {
  strCurrent+=read();//阻塞中
  //然后从消息头中得到长度
  if(current_legnth<real_lenght)
  {
  // 这里再一次进行读取/再进行判断
  cotinue;
  }
  else
  break;
  }
//到这里收完了
}

而在异步下
也用二种保证完整的方法

1. build socket................
2. AsyncSelect(socket,FD_READ);//这里用异步选择吧。完成端口还有其它异步模型我也有同样的可能不正解的疑问!!!!
//变量
string strCurrent;
在处理异步消息的函数中
void OnSock(...)
{
  strCurrent+=rceive(.....);
  //然后从消息头中得到长度
  if(current_legnth<real_lenght)
  {
   // 这里没有读取完咋办?而且有可能下一次的异步消息不是这个套接字发出的!!!
  }
  else 
 {
   ////处理数据
  }  
}

}

我的问题就是第二段代码中那个咋办!!!!!(// 这里没有读取完咋办?而且有可能下一次的异步消息不是这个套接字发出的!!!)

------解决方案--------------------
这里没有读取完咋办?
为Socket建立一个缓存,如果没读取完就把现有的数据缓存起来,直到数据全部读取到为此。

///而且有可能下一次的异步消息不是这个套接字发出的!!
这个是不可能的,同一个客户端发过来的数据不可能会被不同的Socket接收到。
------解决方案--------------------