在下面的代码中,我有一个简单的服务器,每秒向所有客户端发送消息2次,另一个消息每分钟8-10次。使用简单的Indy服务器代码访问冲突
的问题是,我在运行时得到一个错误:
访问冲突在00479740读地址FFFFFFD0
但只有在少数系统,并且每天只有1〜2次。该软件每天工作约10个小时。
我试图使用类似的代码与ICS库似乎很好。
这段代码有什么问题?有没有更好的方法来编码?
void __fastcall TDataNet::DataModuleCreate(TObject *Sender)
{
listaClient= new TThreadList();
psTx= new TStringList();
psRx= new TStringList();
}
void __fastcall TDataNet::DataModuleDestroy(TObject *Sender)
{
IdTCPServer1->Active= false;
listaClient->Free();
delete psTx;
delete psRx;
}
void __fastcall TDataNet::Send(TStrings *ps, TIdContext *AContext)
{
TList *lista;
static int cntSend= 0;
try
{
lista= listaClient->LockList();
if(AContext != NULL)
{
AContext->Connection->IOHandler->Write(ps, true, TIdTextEncoding_UTF8);
}
else
{
for(int i=0; i < lista->Count; i++)
((TDatiClient*)lista->Items[i])->pThread->Connection->IOHandler->Write(ps, true, TIdTextEncoding_UTF8);
}
}
__finally
{
listaClient->UnlockList();
}
}
void __fastcall TDataNet::SetCambioPilota(void)
{
unsigned short hh, mm, ss, ms, hh1, mm1, ss1, ms1;
unsigned short hh2, mm2, ss2, ms2, hh3, mm3, ss3, ms3;
unsigned short hh4, mm4, ss4, ms4, dd4;
unsigned short hh5, mm5, ss5, ms5, dd5;
TStrings *ps;
UnicodeString s;
try
{
ps= psTx;
ps->Clear();
s= "<CAMBIO_PILOTA>";
ps->Add(s);
for(int i=0; i < MAX_PILOTI; i++)
{
s.sprintf(L"<Pilota%02x= I%x,\"A%s\",\"C%s\",\"F%s\",f%x>",
i+1, gara.pilota[i].idnome,
gara.pilota[i].nome.c_str(), gara.pilota[i].nick.c_str(),
gara.pilota[i].nomeTeam.c_str(), gara.pilota[i].idPilotaT);
ps->Add(s);
}
s= "<END_CAMBIO_PILOTA>";
ps->Add(s);
Send(ps);
}
catch(...){}
}
void __fastcall TDataNet::SetDatiGara(void)
{
TStrings *ps;
UnicodeString s;
try
{
ps= psTx;
ps->Clear();
s= "<DATI_GARA>";
ps->Add(s);
s.sprintf(L"<eve=%d,A%x,B%x,C%x,D%x,E%x,F%x,G%x,H%x,I%x,J%x,K%x>", DataB->GetEventoInCorso().idEvento,
DataB->GetEventoInCorso().numEvento, DataB->GetEventoInCorso().subEvento,
DataB->GetNextEvento().idEvento, DataB->GetNextEvento().numEvento, DataB->GetNextEvento().subEvento,
gara.tkTempo, gara.tkDurata - gara.tkTempo,
gara.laps, gara.gDurata > 0 ? (gara.gDurata - gara.laps):0, gara.flInCorso ? (gara.gDurata > 0 ? 2:1):0,
gara.flFineGara);
ps->Add(s);
s= "<END_DATI_GARA>";
ps->Add(s);
Send(ps);
}
catch(...){}
}
void __fastcall TDataNet::Timer1Timer(TObject *Sender)
{
Timer1->Enabled= false;
SetDatiGara();
Timer1->Enabled= true;
}
void __fastcall TDataNet::IdTCPServer1Connect(TIdContext *AContext)
{
TDatiClient* dati;
dati= new TDatiClient;
dati->pThread= AContext;
AContext->Connection->IOHandler->ReadTimeout= 200;
AContext->Data= (TObject*)dati;
try
{
TList* lista;
lista= listaClient->LockList();
lista->Add(dati);
connessioni= lista->Count;
if(FmainWnd)
PostMessage(FmainWnd, WM_EVENTO_TCP, ID_CONNESSO, lista->Count);
int idEvento= DataB->GetEventoInCorso().idEvento;
if(idEvento)
SetCambioStato(idEvento, STATO_EVENTO_START, AContext);
}
__finally
{
listaClient->UnlockList();
}
}
void __fastcall TDataNet::IdTCPServer1Disconnect(TIdContext *AContext)
{
TDatiClient* dati;
dati= (TDatiClient*)AContext->Data;
AContext->Data= NULL;
try
{
listaClient->Remove(dati);
TList* lista;
lista= listaClient->LockList();
connessioni= lista->Count;
if(FmainWnd)
PostMessage(FmainWnd, WM_EVENTO_TCP, ID_DISCONNESSO, lista->Count);
}
__finally
{
listaClient->UnlockList();
}
delete dati;
}
void __fastcall TDataNet::IdTCPServer1Execute(TIdContext *AContext)
{
Sleep(100);
try
{
AContext->Connection->IOHandler->ReadStrings(psRx, -1);
if(psRx->Count >= 2 && psRx->Strings[0] == "<LAST_MINUTE>" && psRx->Strings[psRx->Count-1] == "<END_LAST_MINUTE>")
{
psRx->Delete(0);
psRx->Delete(psRx->Count-1);
if(FmainWnd)
SendMessage(FmainWnd, WM_EVENTO_TCP, ID_LAST_MINUTE, (unsigned int)psRx);
}
psRx->Clear();
}
catch(...) {}
AContext->Connection->CheckForGracefulDisconnect();
}
做一些调试。找出哪一行代码引发异常。堆栈溢出不是调试器。 –
错误消息表示您正在访问的是与NULL指针偏移-48个字节的内容。我看到了这个代码的各种问题。这不是我建议如何与TIdTCPServer实现服务器到客户端的通信,甚至不是如此。它需要重新写入更安全。我明天会发布一个答案。 –
谢谢Remy,查看你的代码 – Mirco