Serversocket占用内存问题

Vtang 2006-12-16 05:16:01
我通过使用Serversocket)编写了一个多线程的服务器程序,与客户程序连接后,程序一切运行正常,但当服务器向客户发送数据完成后,服务器所占内存仍然持续增长(在Windows中通过查看进程管理器,可以看见程序所占内存以每次4K的速度增长)。并且客户端退出后,系统为此连接分配的内存也不能完全释放。这个问题已困扰了我半个月了,请高手帮忙。
...全文
427 10 打赏 收藏 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sbkopoky 2007-02-17
  • 打赏
  • 举报
回复
有一个香港和悦网络电话的源文件 ,有兴趣妨进入我的BLOG看看
wf2091139 2007-02-08
  • 打赏
  • 举报
回复
关注
cppowner 2007-01-22
  • 打赏
  • 举报
回复
晕 如果卡的话 用 IdTCPClient 与IdTCPServer1
这套不错的 挺好用的 你上面写的 没有多线啊 如果2个用户同时 访问怎么办?
do2008 2007-01-18
  • 打赏
  • 举报
回复
1.用CodeGuard看

2.TServerSocket的TServerType 在stThreadBlocking,这种线程阻塞模式,把与每一个Client的处理放在一个单独的子线程中去做,比较方便编程,性能也有保障,相对也比较容易排错。

建议楼主用这种方式看看。
wcpjavastudy 2007-01-10
  • 打赏
  • 举报
回复
邀请c/c++学习的各路好友加入c/c++学习群:17185131
Vtang 2006-12-19
  • 打赏
  • 举报
回复
// savelog(Socket->RemoteAddress+"错误的操作代码");
//fun_Send("错误的操作代码",Cl);
// savelog("发送消息到"+Socket->RemoteAddress+"内容 错误的操作代码");
break;
}








//
//----------------------------------------------数据处理代码





}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
//////////////////////////////////////////////////Memo1->Clear();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
//savelog("与"+Socket->RemoteAddress+"-"+Socket->SocketHandle+"断开");
//StatusBar1->SimpleText="来自"+Socket->RemoteAddress+"-"+Socket->SocketHandle+"接入断开";

}
//---------------------------------------------------------------------------

void __fastcall TForm1::ServerSocket1ClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
/*
switch( ErrorCode )
{
case 10053: Socket->Close();
break;
}

ErrorCode = 0;*/
// savelog("与"+Socket->RemoteAddress+"-"+Socket->SocketHandle+"网络错误");
ErrorCode = 0;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ServerSocket1ClientWrite(TObject *Sender,
TCustomWinSocket *Socket)
{
//socStruct svStruct;
//Socket->ReceiveBuf(&svStruct,sizeof(svStruct));
}
//---------------------------------------------------------------------------
//------------------------------------------------交费数据查询
AnsiString __fastcall TForm1::Cxdata(AnsiString Dmc,AnsiString userno)
{

//查询未交费记录
AnsiString SQL1;
//if (Form1->CheckBox1->Checked==true)
//SQL1= "SELECT userno,begindate,show,use,money,prices,wokercode FROM d_test ";
//else
SQL1= "SELECT userno,begindate,show,use,money,prices,wokercode FROM detail ";
SQL1+="WHERE userno=:userno and flag=0 and money!=0 and begindate!="+StrToDate(fun_GetDateTime(1,3));
SQL1+="order by begindate ";

//查询用户档案信息
AnsiString SQL2="SELECT userno,username,addressname,room FROM view_user WHERE userno=:userno";


//try
//{
// savelog("数据查询开始");

// Query3->Open();
TQuery *Query1;
Query1 = new TQuery(NULL);
Query1->DatabaseName="gas";//"gas";
//Query1->Tem

Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add(SQL2);
Query1->ParamByName("userno")->AsString=userno;
//Query1->Parameters->ParamByName("userno")->Value=userno;
// Query1->Prepared=true;
try
{
Query1->Prepared=true;
Query1->Open();
}
catch(...)
{
Query1->Close();
delete Query1;

AnsiString Dtxt="1|4-数据库操作失败M|";
Dtxt=Get_No(String(Dtxt.Length()),4)+"|"+Dtxt;
return Dtxt;
}
AnsiString user=Dmc+
// "|"+IntToStr(alluse)+"|"+FloatToStr(allmoney)+"|"+FloatToStr(alllatefee)+"|"+IntToStr(Query1->RecordCount)+
Query1->FieldByName("addressname")->AsString.Trim()+
"-"+Query1->FieldByName("room")->AsString.Trim()+
"|"+Query1->FieldByName("username")->AsString.Trim()+"|";

if (Query1->RecordCount!=1)
{
AnsiString Dtxt="1|1-用户缴费号错误|";
Dtxt=Get_No(String(Dtxt.Length()),4)+"|"+Dtxt;
return Dtxt;
}

Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add(SQL1);
Query1->ParamByName("userno")->AsString=userno;
try
{
Query1->Open();
}
catch(...)
{
delete Query1;
AnsiString Dtxt="1|4-数据库操作失败N|";
Dtxt=Get_No(String(Dtxt.Length()),4)+"|"+Dtxt;
return Dtxt;

}
if (Query1->RecordCount==0)
{
AnsiString Dtxt="1|2-无应缴费记录|";
Dtxt=Get_No(String(Dtxt.Length()),4)+"|"+Dtxt;
Query1->Close();
delete Query1;
return Dtxt;
}

int day=0;//,alluse=0;
double money=0.00,latefee=0.00,allmoney=0.00,alllatefee=0.00,latefeerate=0.00;

Query1->First();
AnsiString detail="";
while (!Query1->Eof)
{
money=Query1->FieldByName("money")->AsFloat;
latefeerate=0.005;//StrToInt(Get_Parameter("latefeerate",0,0))*0.00001;
// Showgf(FloatToStr(latefeerate));
// day=StrToDate(fun_GetDateTime(1,3))-StrToDate(Query1->FieldByName("Begindate")->AsString)-StrToInt(Get_Parameter("latefeeterm",2,0));
day=StrToDate(fun_GetDateTime(1,3))-StrToDate(Query1->FieldByName("Begindate")->AsString)-22;
latefee=IntToStr( int(money*latefeerate*day*100)).ToDouble()/100;

if (latefee<0)latefee=0;



detail+=Query1->FieldByName("show")->AsString.Trim()+
"|"+Query1->FieldByName("use")->AsString.Trim()+
"|"+String(FormatFloat("0.00",Query1->FieldByName("prices")->AsFloat/100))+
"|"+FormatFloat("0.00",latefee)+

//"|"+Query1->FieldByName("use")->AsString.Trim()+

"|"+FormatFloat("0.00",Query1->FieldByName("money")->AsFloat)+
"|"+FormatFloat("0.00",Query1->FieldByName("money")->AsFloat+latefee) +


"|"+Query1->FieldByName("Begindate")->AsString.Trim()+



"|"+Query1->FieldByName("wokercode")->AsString.Trim()+
"|";

allmoney=allmoney+ Query1->FieldByName("money")->AsFloat;

alllatefee=alllatefee+latefee;
Query1->Next();
}

AnsiString sendtxt=user; //用户信息
sendtxt+=IntToStr(Query1->RecordCount)+"|";//总欠月数
sendtxt+=FormatFloat("0.00",allmoney)+"|";//总欠金额
sendtxt+=FormatFloat("0.00",alllatefee)+"|";//总欠滞纳金
sendtxt+=detail;

// savelog("数据查询结束");
// Query1->DatabaseName="";
Query1->Close();
// Query1->Prepared=false;
delete Query1;
sendtxt=Get_No(String(sendtxt.Length()),4)+"|"+sendtxt;
return sendtxt;


}






void __fastcall TForm1::savelog(String aa)
{
AnsiString Fn=ExtractFilePath( Application->ExeName)+"//log//"+FormatDateTime("yyyymmdd",Now()).Trim()+".log";
TStringList *ss=new TStringList();
if (FileExists(Fn))
{
ss->LoadFromFile(Fn);
ss->Add(String(FormatDateTime("hh:nn:ss",Now())+" ")+aa);
ss->SaveToFile(Fn);
}
else
{
ss->SaveToFile(Fn);
}

delete ss;
///////////////////////////// Memo1->Lines->LoadFromFile(ExtractFilePath( Application->ExeName)+"//log//"+FormatDateTime("yyyymmdd",Now()).Trim()+".log");
////////////////////////// Memo1->SelStart = Memo1->Text.Length();
/////////////////////////////////// Memo1->SelLength = 0;

}



Vtang 2006-12-19
  • 打赏
  • 举报
回复
//else
Query1->SQL->Add("insert into fee values(:userno,:itemno,:date,:money,:summary,:operaterno)");

Query1->ParamByName("userno")->AsString=Dmc_s[2];
Query1->ParamByName("itemno")->AsString="1001";
Query1->ParamByName("date")->AsString=fun_GetDateTime(1,3);
Query1->ParamByName("money")->AsString="-"+FloatToStr(StrToFloat(Dmc_s[8])+StrToFloat(Dmc_s[9]));
Query1->ParamByName("summary")->AsString=Dmc_s[4];
Query1->ParamByName("operaterno")->AsString=Dmc_s[3];
// Showgf(Query1->SQL->Text);
try
{
Query1->ExecSQL();
}
catch(...)
{
//回滚事务
try
{
TQuery *QueryN;
QueryN = new TQuery(NULL);
QueryN->DatabaseName="gas";;//"gas";
QueryN->Close();
QueryN->SQL->Clear();
QueryN->SQL->Add("Rollback work");
QueryN->ExecSQL();
delete QueryN;
}catch(...){}
delete Query1;
gf="0020|1|4-数据库操作失败J|";
fun_Send(gf,Cl);
savelog(Socket->RemoteAddress+"-"+Socket->SocketHandle+":"+gf);
// gf=String(FormatDateTime("hh:nn:ss",Now())+" ")+"服务端:"+gf;

//Synchronize(MemoAdd);
return;
}
//执行事务
try
{
TQuery *QueryN;
QueryN = new TQuery(NULL);
QueryN->DatabaseName="gas";;//"gas";
QueryN->Close();
QueryN->SQL->Clear();
QueryN->SQL->Add("Commit work");
QueryN->ExecSQL();
delete QueryN;
}
catch(...)
{
//回滚事务
try
{
TQuery *QueryN;
QueryN = new TQuery(NULL);
QueryN->DatabaseName="gas";;//"gas";
QueryN->Close();
QueryN->SQL->Clear();
QueryN->SQL->Add("Rollback work");
QueryN->ExecSQL();
delete QueryN;
}catch(...){}
gf="0020|1|4-数据库操作失败K|";
fun_Send(gf,Cl);
savelog(Socket->RemoteAddress+"-"+Socket->SocketHandle+":"+gf);
// gf=String(FormatDateTime("hh:nn:ss",Now())+" ")+"服务端:"+gf;

//Synchronize(MemoAdd);

return;
}

Query1->Close();
delete Query1;

gf="0002|0|";
fun_Send(gf,Cl);
savelog(Socket->RemoteAddress+"-"+Socket->SocketHandle+":"+gf);
// gf=String(FormatDateTime("hh:nn:ss",Now())+" ")+"服务端:"+gf;
//Synchronize(MemoAdd);

}



break;
//------------------------------------------------------------------------

default:

Vtang 2006-12-19
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
//#include <IniFiles.hpp>
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "trayicon"
#pragma resource "*.dfm"
int crea;
AnsiString SQL1,SQL2,SQL4,SQL5,SQL9,SQL10;
TForm1 *Form1;
extern AnsiString fun_Ini(String Filename_,String Section_,String Ident_,String Defa_,int r_w);
extern AnsiString fun_Reg(AnsiString Filename_,AnsiString Section_,AnsiString Ident_,AnsiString Defa_,int r_w);
extern AnsiString fun_GetDateTime(int Type_,int Data_); //获得日期时间 参数1-1-DATE 2-Time 3-DateTime 参数2 1-SQLSERVER 2-ACCESS 3-INFORMIX
extern AnsiString Get_Parameter(AnsiString lb_,int bool_,int len_);//获取PARAMETER表参数
extern bool Query(AnsiString sql_,int bl_); //查询
extern AnsiString Cxdata(AnsiString Dmc,AnsiString userno);
extern AnsiString Get_No(AnsiString lb_,int len_); //1-字段 3-如果加1给出宽度

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
bool __fastcall TForm1::fun_Send(AnsiString sendtxt,int Cl_)
{
bool re;
try
{
for(int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
{
if (ServerSocket1->Socket->Connections[i]->SocketHandle==Cl_)
{
ServerSocket1->Socket->Connections[i]->SendBuf(sendtxt.c_str(),sendtxt.Length());
re=true;
}
}
}
catch(...)
{
re=false;
}
return re;
}



void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (Button1->Caption=="启动服务")
{
ServerSocket1->Port=StrToInt(Edit1->Text.Trim());
ServerSocket1->Active=true;
ServerSocket1->Open();
Button1->Caption="停止服务";
}
else
{
//ServerSocket1->Port=StrToInt(Edit1->Text.Trim());
ServerSocket1->Active=false;
ServerSocket1->Close();
Button1->Caption="启动服务";
}

}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
//savelog("来自"+Socket->RemoteAddress+"-"+Socket->SocketHandle+"接入");
//StatusBar1->SimpleText="来自"+Socket->RemoteAddress+"-"+Socket->SocketHandle+"接入";

}
//---------------------------------------------------------------------------

void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{

int Cl=Socket->SocketHandle;
int cc=Socket->ReceiveLength();
AnsiString gf;
char buf[2500];
Socket->ReceiveBuf(buf,cc);
AnsiString Dmc=AnsiString(buf);
//StatusBar1->SimpleText=Dmc;
AnsiString Dmc_s[150];
AnsiString temp_s="";
savelog(Socket->RemoteAddress+"-"+Socket->SocketHandle+"-"+cc=Socket->ReceiveLength()+":"+String(buf).Trim());
int m=1,n=0;
while (m<Dmc.Length()+1)
{
temp_s="";
while(Dmc.SubString(m,1)!="|" && m<Dmc.Length()+1)
{
temp_s=temp_s+Dmc.SubString(m,1);
m=m++;
}
Dmc_s[n]=temp_s;
n=n++;
if (Dmc.SubString(m,1)=="|")m=m++;
}
int c;
try{ c=StrToInt(Dmc_s[1]);}catch(...){ c=5; }
AnsiString userno=Dmc_s[2];

switch(c)
{
case 1:
{
Dmc=Dmc.SubString(6,Dmc.SubString(1,4).ToInt());
TReplaceFlags op;
Dmc=StringReplace(Dmc,"1","0",op) ;
gf=Cxdata(Dmc,userno);
fun_Send(gf,Cl);
savelog(Socket->RemoteAddress+"-"+Socket->SocketHandle+":"+gf);
// StatusBar1->SimpleText=gf;
}
break;




case 2:

{

if (Dmc!=Cxdata(Dmc.SubString(6,17),userno))
{
gf="0019|1|3-数据校验错误|";
fun_Send(gf,Cl);
savelog(Socket->RemoteAddress+"-"+Socket->SocketHandle+":"+gf);

// StatusBar1->SimpleText=gf;
return;
}


//开始事务
try
{
TQuery *QueryN;
QueryN = new TQuery(NULL);
QueryN->DatabaseName="gas";;//fun_Ini("Server.INI","Dataserver","DatabaseName","",1);
QueryN->Close();
QueryN->SQL->Clear();
QueryN->SQL->Add("Begin work");
QueryN->ExecSQL();
delete QueryN;
}
catch(...)
{


// Cl=ClientSocket->SocketHandle;
//delete Query;
gf="0019|1|4-数据库操作失败A|" ;
fun_Send(gf,Cl);
savelog(Socket->RemoteAddress+"-"+Socket->SocketHandle+":"+gf);

// gf=String(FormatDateTime("hh:nn:ss",Now())+" ")+"服务端:"+gf;
//Synchronize(MemoAdd);
return;

}

//进行交费修改

TQuery *Query1;
Query1 = new TQuery(NULL);
Query1->DatabaseName="gas";;//fun_Ini("Server.INI","Dataserver","DatabaseName","",1);

Query1->Close();
Query1->SQL->Clear();
//if (Form1->CheckBox1->Checked==true)
// Query1->SQL->Add("update d_test set latefee=:latefee,inmoney=:inmoney,enddate=:enddate,operaterno=:operaterno,flag=2,summary=:summary ");
//else
Query1->SQL->Add("update detail set latefee=:latefee,inmoney=:inmoney,enddate=:enddate,operaterno=:operaterno,flag=2,summary=:summary ");

Query1->SQL->Add("WHERE userno=:userno and begindate=:begindate and money=:money and flag=0");

int e=13;
for (int t=1;t<=StrToInt(Dmc_s[7]);t++)
{
Query1->ParamByName("userno")->AsString=Dmc_s[2];
Query1->ParamByName("enddate")->AsString=fun_GetDateTime(1,3);
Query1->ParamByName("operaterno")->AsString=Dmc_s[3];
Query1->ParamByName("summary")->AsString=Dmc_s[4];

//13
Query1->ParamByName("latefee")->AsString=Dmc_s[e];
e=e+1;//14
Query1->ParamByName("money")->AsString=Dmc_s[e];
e=e+1; //15
Query1->ParamByName("inmoney")->AsString=Dmc_s[e];
e=e+1;//16
Query1->ParamByName("begindate")->AsString=Dmc_s[e];
e=e+5;//19

try
{
Query1->ExecSQL();
if (Query1->RowsAffected!=1)
//回滚事务 {
{
try
{
TQuery *QueryN;
QueryN = new TQuery(NULL);
QueryN->DatabaseName="gas";;//fun_Ini("Server.INI","Dataserver","DatabaseName","",1);
QueryN->Close();
QueryN->SQL->Clear();
QueryN->SQL->Add("Rollback work");
QueryN->ExecSQL();
delete QueryN;
}catch(...){}
Query1->Close();
delete Query1;

CACACACACA 2006-12-17
  • 打赏
  • 举报
回复
代码问题的可能性最大.
leonatcs 2006-12-16
  • 打赏
  • 举报
回复
这种问题只能是先用CodeGuard看,看不出再贴出来代码,人工检查。
我现在想到的是不是没有调用close之类的方法。

1,317

社区成员

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

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