关于异步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接收到。
------解决方案--------------------