SocketConnection,如何捕捉连接失败的错误(100分)

  • 主题发起人 主题发起人 D李
  • 开始时间 开始时间
D

D李

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序为
socketconnction1.Host := Host ;//host,IP为自定义的变量
SocketConnction1.Address := IP ;
try
socketconnection1.Connected := true;

except
Application.MessageBox(' 无法连接!'+ #13#10+'请检查你的网络!','退出',mb_ok+mb_iconerror);

end;
由于,SocketConnection没有timeout,所以一旦运行时出现错误,整个程序就死掉。
无响应。
 
你用一个Ttimer控件
object Timer1: TTimer
Enabled = False
Interval = 5000
OnTimer = Timer1Timer
Left = 72
Top = 56
end

procedure TForm1.Button1Click(Sender: TObject);
begin
SocketConnection1.Open;
end;

procedure TForm1.SocketConnection1BeforeConnect(Sender: TObject);
begin
Timer1.Enabled := True;
end;

procedure TForm1.SocketConnection1AfterConnect(Sender: TObject);
begin
Timer1.Enabled := False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
SocketConnection1.Close;
Application.MessageBox('connected failed!');
end;
 
也可以采用自定义消息。
 
关注!
如果在连接成功以后网络中断,程序通常是不会知道网络已经中断了的。除非在每次读
socket的时候来进行判断(在简单的程序中我们通常通过select函数来判断读取socket
是否超时,根据其是否超时来判断网络是否中断
http://www.delphibbs.com/delphibbs/dispq.asp?LID=1073953),
但TSocketConnection的封装比较复杂,如果要从底层修改的话真是要花不少功夫,
不知有没有简便可行的办法。
 
用时钟是没有用的,程序已经没有响应了,时钟还能响应吗?
我想通过消息来处理,但不晓得是什么消息,
其值是什么,望大虾指点,谢谢!
 
我编写程序是这样做的,供你参考:
服务器端启动后发广播,在客户端接收此广播,如果规定时间内客户端没有收到此广播。
则说明服务器没有启动。再弹出一个消息就行了。要不要代码?
 
谢谢,请提供代码
 
一、在服务器端放一NMUDP控件,我用的是D6,位于FastNet控件板中,
设置其属性如下:
LocalPort:=1234;
RomotePort:=5678; //设置成其它的端口也行,只是不要有什么冲突
RomoteHost:='192.168.0.255'; //最后一组数为255表示广播
二、在服务器端放一Timer控件,设置其Interval属性为1000
(每隔1秒发一次广播),在其OnTimer事件中写入下列代码:
var
c:arrar [1..6] of char;
begin
c:='Server'; //c可赋任意字符串
NMUDP1.SendBuffer(c,6);
end;
三、在客户端启动窗体中放一Timer控件,设置其Interval值为1000
再放一NMUDP控件,属性设置如下:
LocalPort:=5678;
RomotePort:=1234; //一定要与服务器的端口相对应
然后在其OnDataReceived事件中写一句代码
ServerIP:=FromIP; //ServerIp为变量,应该在窗体中定义
四、在OnTimer事件中,写入如下代码:
totaltime:=totaltime+1;
if Totaltime<=10 then //totaltime应该定义有窗体中,不要定义在此过程中
begin
if ServerIP<>'' then
begin
Timer1.Interval:=0;
SocketConnection1.Address:=ServerIP;
SocketConnection1.Connected:=True; //在设计阶段设置为False
end;
end
else
begin
Timer1.Interval:=0;
Application.MessageBox('服务器没有启动,请稍后再试!','提示',MB_ICONSTOP);
end;







 
原来,是这样。我就是不想再加控件上去,
我自己定义了一个套接字也没有用,不能捕获winsocket的错误。
一般网络问题都是引用winsocket单元。我想他一定要对操作系统发一个消息
想知道是什么消息,我就可以捕获到了。
要是向你讲的用上其他的控件,我可以直接用winsnock的控件先判断网络是否通
在进行处理。
我是本着学习的态度去看待这个问题,谢谢你给我的回答,我会为你加分的
 
我这样做的目的是让服务器程序在任何一台计算机运行,客户端都能正确连接
当然必须在同一个网段中,这样便于程序的发布!
 
多人接受答案了。
 
后退
顶部