关于异步socket下TCP数据完整的问题。答对马上给分。

gnhao 2008-05-07 11:45:58
上次也问了。不过朋友们说的是我知道的保证数据完整的方法。
如下:
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
 {
   ////处理数据
  }
}

}

我的问题就是第二段代码中那个咋办!!!!!(// 这里没有读取完咋办?而且有可能下一次的异步消息不是这个套接字发出的!!!)
...全文
66 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
na_he 2008-05-07
  • 打赏
  • 举报
回复
思路了,我写过的代码片断了,希望能帮到你,呵呵
stsCode = CNGSocket::Create(nSocketType);
if (stsCode != statusOk)
{
break;
}

unsigned long lCmd = FALSE;
stsCode = IOCtl(FIONBIO, &lCmd);
if (stsCode != statusOk)
{
break;
}

// Bind socket to port
stsCode = Bind(nSocketPort, NULL);
if (stsCode != statusOk)
{
break;
}
// Listen
stsCode = Listen();
if (stsCode != statusOk)
{
break;
}
// Select Accept & Close event
stsCode = EventSelect(FD_ACCEPT);
if (stsCode != statusOk)
{
break;
}
// Create Event
m_hEventTask = CreateEvent(NULL, FALSE, FALSE, NULL);
if (m_hEventTask == NULL)
{
stsCode = statusEventCreateError;
break;
}
// Create task schedule thread
DWORD dwThreadId = 0;
m_hThreadTask = CreateThread(NULL, 0, ProcTaskThreadProc, this, 0, &dwThreadId);
if (m_hThreadTask == NULL)
{
stsCode = statusCreateThreadError;
break;
}
// Init critical section
InitializeCriticalSection(&m_csTask);
return stsCode;
na_he 2008-05-07
  • 打赏
  • 举报
回复
onsock中启动一个线程在这个socket上面接收数据,数据接收完后,停掉该线程,呵呵!
fairyprince 2008-05-07
  • 打赏
  • 举报
回复
对每个连接应文该保有消息缓冲池!这样做是必须的!并且要将访问串行化!
gnhao 2008-05-07
  • 打赏
  • 举报
回复
而在异步下
也用每二种保证完整的方法
多了个"每"字
gnhao 2008-05-07
  • 打赏
  • 举报
回复
呵。还是用array(key,value)来保存没有接收完成的socket的数据吧。要是都建立线程.如果socket多的话就累了!!

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧