18,363
社区成员




void main()
{
for(;cpu*2+2;)///启动cpu*2+2个工作线程去处理异步消息
{
Thread(NULL,NULL,Workthread,this,NULL);
}
for(;10;)
{
PostAccept(); /////投递10个异步Accept请求
}
}
Workthread()
{
while()
{
if(GetMeaage()!=true);//循环接收异步消息
continue;
CheckEeror(); ///检查错误码
switch(Type)
{
case Accept: //收到连接消息
{
Getinfo(); //获取远程主机信息
PostWsaRecv(Head);////投递异步接收包头请求
PostAccept(); ///继续投递异步Accept请求,保持工作线程能同时接收10个连接
}
case Head: //收到包头消息
{
SetMsg();把提取包头的数据加入到消息结构体中
PostWsaRecv(Body);//投递异步接收包体消息
}
break;
case Body: ///收到包体消息
{
if(Bodylent < HeadMsg.lent)///收到的包体是殘包,有可能这是个非法包,又有可能数据还在缓冲区里面
{
//////////////////////////////////////////////////////////////如果数据还在缓冲区里面那就继续接收就可以了
SetMsg(); //重新设置消息结构体内容
PostWsaRecv(Body);//投递异步接收包体消息
//////////////////////////////////////////////////////////////////////////////////////////////////
但是,如果是黑客发送过来的一个非法包呢?
/*
实际期待: 01 08 00 00 00 00 00 00 00 00
黑客发送一个比包头要小的数据包:01 08 00 00 00 00 00 00 00
就会造成工作线程死锁,当黑客发送几十个这样的包时候你的程序也就挂掉了
老师说收到殘包之后进行哈希校验
百度了一下哈希校验还不是很懂,这里希望大家能帮忙解决下
if(Hashchek == 非法包)
{
closesoket();
}
*/
}
else if(Bodylent > HeadMsg.lent)//收到的包体大小大于包头定义的大小说明是非法包,直接断开连接
{
closesoket();
}
else if(Body == HeadMsg.lent) ///包体收完了
{
PostWsaRecv(Head);//投递异步接收包头消息用来接收下一次数据包的收发
}
else ///奇葩的长度,直接断开你
{
closesoket();
}
}
case send:
{
PostWsaSend(); //投递异步发送消息
}
break;
}
}
}
case Head:
{
ProcessHead();
CheckHead();
PostWsaRecv(Body);
}
break;
case Body:
{
if(Bodylent < HeadMsg.lent)
{
PostWsaRecv(Body);
//这里不需要考虑是包的内容长度是否够
//只要还有数据过来 你总是能凑够HeadMsg.lent
//如果一直没有数据过来 就是超时处理
}
else
{
ProcessBody();
PostWsaRecv(Head);
}
}