服务端的Socket关闭的问题,急急在线等!
我写了一个服务程序是个多线程服务程序,客户端也会有多个连接,服务端有个线程在监听每接受到一个连接请求就new应SOCKET对象,然后把Socket的指针传给一个线程,启动这一个处理数据的线程接受数据,我的客户端测试程序是发送完数据就关闭的连接,服务端要处理完成才能关闭连接删除Socket,一开始运行正常但是服务端的句柄不断增长,最后服务端非常慢,不知什么原因,望高人指点
监听的线程
void TfrmMain::ThreadServerSocket(void* Para)
{
//TPSocket *pSocket = new TPSocket();
frmMain->m_bSocketServerRunning = true;
if(frmMain->m_ServerSocket.Create()==WINSOCKET_SUCCESS){
if(frmMain->m_ServerSocket.Bind("",frmMain->m_nTelecomPort)){
// int nRet = frmMain->m_ServerSocket.Listen(5);
// nRet = WSAGetLastError();
if(frmMain->m_ServerSocket.Listen(100)){
frmMain->StatusBar1->Panels->Items[0]->Text = "状态: 等待连接";
while(frmMain->m_bSocketServerRunning){
frmMain->m_ServerSocket.SetNonBlock(1);
if(frmMain->m_ServerSocket.WaitAccept(50) > 0){
TPSocket *pSock = new TPSocket();
pSock->Create();
frmMain->m_ServerSocket.Accept(*pSock);
pSock->SetNonBlock(1);
//启动一个线程处理连接的数据
_beginthread(frmMain->ThreadRevData,0,(LPVOID)pSock);
frmMain->AddClientCount();
// Application->ProcessMessages();
Sleep(4);
}
}
}
}
}
frmMain->m_ServerSocket.Close();
}
处理线程
void TfrmMain::ThreadRevData(void* Para)
{
TPSocket* pSocket = (TPSocket*)Para;
char Buffer[1024];
int nRealRead;
bool bResponseFlag; //消息回复标志true需要回复 false不需要回复
STRUCT_BLADE_PAK* pPack;
TListItem* pItem;
pPack = NULL;
nRealRead = 0;
ZeroMemory(Buffer,1024);
nRealRead = pSocket->WaitReceive(Buffer,1024,500);// >Receive(Buffer,512);
Application->ProcessMessages();
if(nRealRead>0){
frmMain->Memo1->Lines->Add(Buffer);
// pItem = frmMain->lvUp->Items->Add();
// pItem->Caption = Buffer;
if(frmMain->Memo1->Lines->Count>1000)
frmMain->Memo1->Clear();
Application->ProcessMessages();
TMyMsgStruct* pMsg = new TMyMsgStruct(Buffer);
nTmp = pSocket->WaitSend(Buffer,strlen(Buffer),500);
if(pMsg->GetPackError()){
//读取的消息有错误
pSocket->Close();
delete pSocket;
delete pMsg;
//减少一个连接
frmMain->ReduceClientCount();
return;
}
AnsiString strDest, strSour, strGameCode;
if(!frmMain->GetDestSour(strDest, strSour, strGameCode,
Now().FormatString("hh:mm:ss").c_str())){
//此时间段内没有节目安排
pSocket->Close();
delete pSocket;
delete pMsg;
//减少一个连接
frmMain->ReduceClientCount();
return;
}
pMsg->SetDest(strDest.c_str());
pMsg->SetSour(strSour.c_str());
ZeroMemory(Buffer,512);
pMsg->GetCallerID(Buffer);
bResponseFlag = pMsg->GetResponseType();
int nTmp;
if(bResponseFlag){
//必须回复的消息
pPack = frmMain->CheckMsgRecieve(Buffer, pMsg->GetMsgType());
// bool bCheckRecieveMeg;
// bCheckRecieveMeg = true;
if(pPack){
//已收到的消息队列中已有此用户对应消息的回复
frmMain->GetResponseIVRInfor(pPack, strGameCode, Buffer);
nTmp = pSocket->Send(Buffer,strlen(Buffer));
if(nTmp == SOCKET_ERROR){
//向网关发送数据失败,把消息发出去更新收到消息队列中的该消息的回应
frmMain->SendBladePack(pMsg->GetBladePack());
}
else{
//回应IVR数据成功,要删除收到消息队列中的消息
frmMain->DelOneRecieveMsg(pPack);
//把消息添加道MSG_LOG中处理
// frmMain->m_pMsgLog->InsertOneItem(pPack,
// Now().CurrentTime().FormatString("hh:mm:ss.zzz").c_str(),NULL,false);
}
pSocket->Close();
delete pSocket;
pSocket = NULL;
}
else{
//已收到的消息队列中没有此用户对应消息的回复
frmMain->SendBladePack(pMsg->GetBladePack());
//延时等待一会再去检查收到消息队列,看看刚刚发送的消息是否有回复
Sleep(5);
pPack = frmMain->CheckMsgRecieve(Buffer, pMsg->GetMsgType());
if(pPack){
//已收到的消息队列中已有此用户对应消息的回复
frmMain->GetResponseIVRInfor(pPack, strGameCode, Buffer);
nTmp = pSocket->Send(Buffer,strlen(Buffer));
//把消息添加道MSG_LOG中处理
// frmMain->m_pMsgLog->InsertOneItem(pPack,
// Now().CurrentTime().FormatString("hh:mm:ss.zzz").c_str(),NULL,false);
pSocket->Close();
delete pSocket;
pSocket = NULL;
}
}
}
else{
//该消息无需回复,直接发送即可
frmMain->SendBladePack(pMsg->GetBladePack());
}
//把消息添加道MSG_LOG中处理
// frmMain->m_pMsgLog->InsertOneItem(pMsg->GetBladePack(),
// Now().FormatString("hh:mm:ss.zzz").c_str(),pMsg->GetCallerIDAddress(),true);
delete pMsg;
pMsg = NULL;
}
//减少一个连接
pSocket->Close();
delete pSocket;
pSocket = NULL;
frmMain->ReduceClientCount();
}