我写了一个程序,用来截获http请求处理并返回,采用多线程。可程序总在持续一段时间后出现cpu持续超过90%不降下来,我找了几天都不知道哪里出了问题,代码如下:
try
{
//开始侦听连接请求
if(!g_sListen.Accept(sConnect, saClient))
{
//在应用程序关闭时的处理
g_bListening=FALSE;
delete [] buffer;
return 0;
}
//连接数增加一个
g_nConnection++;
//开始另一个服务器线程
AfxBeginThread(ServerThreadProc, pParam, THREAD_PRIORITY_NORMAL);
//从客户端(浏览器)读取请求
sConnect.ReadHttpHeaderLine(request1, MAXLINELENGTH, 10);
//解析请求并作相应的处理
if(Parse(request1, &pToken1, &pToken2))
{
//浏览器GET方式
if(!stricmp(pToken1, "GET"))
{
do
{
//读取请求的剩余部分
sConnect.ReadHttpHeaderLine(request2, MAXLINELENGTH, 10);
}
while(strcmp(request2, "\r\n"));
(处理程序)
{
CCriticalSection::Owner lock(g_criticalSection2);
wsprintf(headers, hdrFmt, (const char*) strGmtNow, strCon.length());
strcat(headers, "\r\n");
sConnect.Write(headers, strlen(headers), 10);
sConnect.Write(strCon.c_str(),strCon.length(),10);
}
}
else
{
//其它的请求方式
}
}
else
{
//错误的请求
}
//关闭套接字
Sleep(1);
sConnect.Close();
}
catch(CMyBlockSocketException* pe)
{
//错误处理
pe->Delete();
}
delete [] buffer;
if(pFile) delete pFile;
return 1;处理程序没问题,应为我另外还有写一个类似的程序,不过是使用消息队列,两者具体的处理是一样的,而那个程序没有这种问题。
另外,当cpu持续过高的时候程序并没死,还会处理新的请求。而且请求的客户端也都得到返回,所以我一直无法确定是什么情况引起的。
而且,这个问题只发生在很多用户持续发请求的时候。
请高手帮帮我吧,老板要我解决这个问题,我都三天了还是搞不定,这样下去我惨了T^T,拜托了!!!
try
{
//开始侦听连接请求
if(!g_sListen.Accept(sConnect, saClient))
{
//在应用程序关闭时的处理
g_bListening=FALSE;
delete [] buffer;
return 0;
}
//连接数增加一个
g_nConnection++;
//开始另一个服务器线程
AfxBeginThread(ServerThreadProc, pParam, THREAD_PRIORITY_NORMAL);
//从客户端(浏览器)读取请求
sConnect.ReadHttpHeaderLine(request1, MAXLINELENGTH, 10);
//解析请求并作相应的处理
if(Parse(request1, &pToken1, &pToken2))
{
//浏览器GET方式
if(!stricmp(pToken1, "GET"))
{
do
{
//读取请求的剩余部分
sConnect.ReadHttpHeaderLine(request2, MAXLINELENGTH, 10);
}
while(strcmp(request2, "\r\n"));
(处理程序)
{
CCriticalSection::Owner lock(g_criticalSection2);
wsprintf(headers, hdrFmt, (const char*) strGmtNow, strCon.length());
strcat(headers, "\r\n");
sConnect.Write(headers, strlen(headers), 10);
sConnect.Write(strCon.c_str(),strCon.length(),10);
}
}
else
{
//其它的请求方式
}
}
else
{
//错误的请求
}
//关闭套接字
Sleep(1);
sConnect.Close();
}
catch(CMyBlockSocketException* pe)
{
//错误处理
pe->Delete();
}
delete [] buffer;
if(pFile) delete pFile;
return 1;处理程序没问题,应为我另外还有写一个类似的程序,不过是使用消息队列,两者具体的处理是一样的,而那个程序没有这种问题。
另外,当cpu持续过高的时候程序并没死,还会处理新的请求。而且请求的客户端也都得到返回,所以我一直无法确定是什么情况引起的。
而且,这个问题只发生在很多用户持续发请求的时候。
请高手帮帮我吧,老板要我解决这个问题,我都三天了还是搞不定,这样下去我惨了T^T,拜托了!!!
sleep(1000)
一个负责截获,一个负责分析
一个负责截获,一个负责分析我认为
你建2个线程
1#负责截获并把请求填进一个队列里
2#不停的从队列里取得请求2者之间的驱动关系是事件驱动
2# 循环 waitforsingleobject
1# 有了请求就setevent