服务端的Socket关闭的问题,急急在线等!

Joininthefun 2006-08-22 01:06:29
我写了一个服务程序是个多线程服务程序,客户端也会有多个连接,服务端有个线程在监听每接受到一个连接请求就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();
}
...全文
517 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yy2001 2006-08-23
  • 打赏
  • 举报
回复
gz
Joininthefun 2006-08-23
  • 打赏
  • 举报
回复
to:hugai780717(水手)
肯定不是病毒的事,我的服务端只要接受了客户端的连接请求,处理完毕关闭时没有错误发生但是内存和句柄数就是不断上涨,但是我不接受就没有增长的现象
hugai780717 2006-08-22
  • 打赏
  • 举报
回复
说不定你服务器有问题,有很多服务器被病毒后,你通过查看内存资源,会一直在吃掉内存.

不在开启服务器程序的时候你再查查服务器资源吧
iec 2006-08-22
  • 打赏
  • 举报
回复
vc/mfc网络版很有意思,你去那里收一收iocp.
Joininthefun 2006-08-22
  • 打赏
  • 举报
回复
对没错,我也delete pSocket
Joininthefun 2006-08-22
  • 打赏
  • 举报
回复
to IEC:

你说用完成端口,能不能给点资料最好是源码看看,邮箱:joininthefun@163.com谢谢!
iec 2006-08-22
  • 打赏
  • 举报
回复
TPSocket *pSock = new TPSocket();在这里是局部变量指针.用完之后要delete pSock ;
iec 2006-08-22
  • 打赏
  • 举报
回复
pSocket不能立即close掉,要延迟2分钟左右才能关掉,所以句柄会增加很快,资源不能马上释放.我觉得这设计最好用完成端口来做,比较合理.
Joininthefun 2006-08-22
  • 打赏
  • 举报
回复
我的Socket类的关闭函数:
int TPSocket::Close( void )
{
if(m_hSocket != INVALID_SOCKET){
shutdown(m_hSocket,2);
// closesocket(m_hSocket);
if(WINSOCKET_ERROR == closesocket(m_hSocket)){
//------------
}
m_hSocket = INVALID_SOCKET;
}

memset( &m_sockaddr, 0, sizeof( sockaddr_in ) );
memset( &m_rsockaddr, 0, sizeof( sockaddr_in ) );

return WINSOCKET_SUCCESS ;
}

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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