关于INDY控件错误铺抓问题

zly1980 2008-10-15 10:45:09
我用BCB6(INDY不记得版本了)或者BCB2007(INDY10)里面 IDTELNET控件.
就是直接建立一个winfrom程序,在界面拖了个IDTELNET出来.
之后连接到telnet服务器,如果在连接的过程中,网络出现错误的话,那么应用程序会弹出错误:
raised exception class EIdSocketError whith meessage 'Socket Error # 10054 Connection reset by peer.'

我想知道我的才程序可以自己处理这些错误吗?如果可以是怎么个方式进行错误的铺获,而不是动不动就弹出一个对话框来.
...全文
317 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
samkaola 2012-06-09
  • 打赏
  • 举报
回复
这个问题大家怎么处理的呀
Waiting4you 2008-10-15
  • 打赏
  • 举报
回复
这个错误应该可以被WinMain里的catch抓到(就是Project->View Source里的代码)
zly1980 2008-10-15
  • 打赏
  • 举报
回复
可能我对INDY的组件模式还是理解上有问题吧.
大家也对我的问题理解有所错误.
我在界面拉了个IDTELNET出来,之后一个MEMO,在MEMO的KEYPRESS事件把key通过idtelnet发到服务器上去/
idtelnet接收到的数据在MEMO显示出:
//发送输入的按键
void __fastcall TForm1::Memo1KeyPress(TObject *Sender, char &Key)
{
IdTelnet1->SendCh(Key);
Key=0;
}
//显示接收到的数据
void __fastcall TForm1::IdTelnet1DataAvailable(TIdTelnet *Sender,
const AnsiString Buffer)
{
AnsiString s;
int i;
s=Buffer;
while(1)
{
i=s.Pos("\r");
if(i<1) break;
s.Delete(i,1);
s.Insert("\n\n",i);
}
while(1)
{
i=s.Pos("\n\n");
if(i<1) break;
s.Delete(i,2);
s.Insert("\r\n",i);
}
if(Memo1->Lines->Count<1) Memo1->Lines->Add("");
Memo1->Lines->Strings[Memo1->Lines->Count-1]=
Memo1->Lines->Strings[Memo1->Lines->Count-1]+s;
}
//连接
void __fastcall TForm1::Button1Click(TObject *Sender)
{
try
{
IdTelnet1->Host=Edit1->Text.Trim();
IdTelnet1->Port=atoi(Edit2->Text.c_str());
IdTelnet1->Connect();
}
catch (...)
{
;//如果在点连接的时候服务器连接不上的时候,可以铺抓到异常.这里没有问题
}
}


现在的问题是:我点Button1连接成功,welcome...的字符也出来了,我输入用户跟密码后,已经连接成功了.
这个时候我什么都不做,直接把电脑的网络断开(可以是把连接禁止或者把我网线拔掉,总之结果就是造成运行程序的主机到服务器的网络是不通的)
那么等一下程序就弹出:
raised exception class EIdSocketError whith meessage 'Socket Error # 10054 Connection reset by peer.'
这个错误了,这个时候我没有执行任何的操作,我的代码是抓不到的,这个控件也没有OnError类的事件给到我.我应该在怎么得到这些错误异常呢?
yuanreid 2008-10-15
  • 打赏
  • 举报
回复

try
{
IdTelnet1->Connect();
}
catch(Exception &e)
{
ShowMessage(e.Message);
}


可以在catch住错误后,自行处理,这里是显示错误提示。
yuanreid 2008-10-15
  • 打赏
  • 举报
回复
try catch是可以拦截这个错误的


try
{
IdTelnet1->Connect();
}
catch(...)
{
}
netying 2008-10-15
  • 打赏
  • 举报
回复
帮你up
yuanreid 2008-10-15
  • 打赏
  • 举报
回复
看来是找到方法了。祝贺
zly1980 2008-10-15
  • 打赏
  • 举报
回复
void __fastcall OnTerminate(TObject* Sender);
void __fastcall OnException(TIdThread* AThread, Exception* AException);

void __fastcall TForm1::Button1Click(TObject *Sender)
{
try
{
IdTelnet1->Host=Edit1->Text.Trim();
IdTelnet1->Port=atoi(Edit2->Text.c_str());
IdTelnet1->ThreadedEvent=true;
IdTelnet1->Connect();
IdTelnet1->TelnetThread->OnTerminate=OnTerminate;
IdTelnet1->TelnetThread->OnException=OnException;
//while(1){Application->ProcessMessages();}
}
catch (...)
{
;
}
}
好象这样错误,断开连接等...都过来了
laowang2 2008-10-15
  • 打赏
  • 举报
回复
upup
yuanreid 2008-10-15
  • 打赏
  • 举报
回复
这个错误只能被winmain拦截了。

try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);//在这里进行你自己的错误处理
}
使用TIdAntiFreeze对抗“冻结”   Indy使用一个特殊的组件TIdAntiFreeze来透明地解决客户程序用户界面“冻结”的问题。TIdAntiFreeze在Indy内部定时中断对栈的调用,并在中断期间调用Application.ProcessMessages方法处理消息,而外部的Indy调用继续保存阻塞状态,就好像TIdAntiFreeze对象不存在一样。你只要在程序中的任意地方添加一个TIdAntiFreeze对象,就能在客户程序中利用到阻塞式Socket的所有优点而避开它的一些显著缺点。   Indy使用了线程技术   阻塞式Socekt通常都采用线程技术,Indy也是如此。从最底层开始,Indy的设计都是线程化的。因此用Indy创建服务器和客户程序跟在Unix下十分相似,并且Delphi的快速开发环境和Indy对WinSock的良好封装使得应用程序创建更加容易。   Indy服务器模型   一个典型的Unix服务器有一个或多个监听进程,它们不停地监听进入的客户连接请求。对于每一个需要服务的客户,都fork一个新进程来处理该客户的所有事务。这样一个进程只处理一个客户连接,编程就变得十分容易。   Indy服务器工作原理同Unix服务器十分类似,只是Windows不像Unix那样支持fork,而是支持线程,因此Indy服务器为每一个客户连接分配一个线程。   图1显示了Indy服务器的工作原理。Indy服务器组件创建一个同应用程序主线程分离的监听线程来监听客户连接请求,对于接受的每一个客户,都创建一个新的线程来为该客户提供服务,所有与这一客户相关的事务都由该线程来处理。   使用组件TIdThreadMgrPool,Indy还支持线程池。   线程与Indy客户程序   Indy客户端组件并未使用线程。但是在一些高级的客户程序中,程序员可以在自定义的线程中使用Indy客户端组件,以使用户界面更加友好。

1,317

社区成员

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

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