clientsocket、serversocket的连接问题(50分)

  • 主题发起人 主题发起人 滚滚红尘
  • 开始时间 开始时间

滚滚红尘

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个比较简单的但又困惑我的问题:我用clientsocket,serversocket进行局域网编
程时,如果先运行server端,将其active设置为true,再运行client端,能正常连接;但
反过来,就会出现运行时错误。我希望客户端在运行后,能不断尝试连接,一发现服务端
就进行连接。哪位大哥给个意见?
 
在clientsocket的onerror事件进行处理:
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
ClientSocket1.Active:=true;
end;
 
同意楼上的,不过用个timer来监测也可以哦!

if not ClientSocket1.Active then ClientSocket1.Active:=true!
 
楼上楼上的代码有问题哟,呵呵,你具体做几各程序就知道要出错误的
 
以上说的都不完全,当客户端连接多次失败后(同机器配置,内存大小有关,
我的机器,PIII850,256M, 20000次以上)后,由于客户端失败后,SOCKET 未释放,
系统会崩溃。
在clientsocket的onerror事件进行处理:
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
end;

Timer 事件中(每隔若干秒触发一次)
if Not ClientSocket1.Active then
begin

//先释放上次连接失败的 Socket 的内存!
ClientSocket1.Socket.Free; //在这里可做测试,如果将该句取消,且将 Timer
//触发时间改短(如:0.1 秒),一定时间后,系统
//报错!
ClientSocket1.Active := True;
end;

以上是本人在项目中碰到的真实问题!!
 
TO Jondona:
最完善的代码如下:
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
if ErrorEvent=eeConnect then
begin
ClientSocket1.Active:=false;
ErrorCode:=0;
end;
end;
 
同时ErrorCode一般的值是10061和10060等,不太稳定,
 
我觉得几位大哥说得都有道理。大受启发!顺便问一句:在Dephi6中,只要一将ClientSocket
的active设为真就出错。难道它的使用和5不同吗?
 
我试了一下Jondona的代码,会出现新的运行时错误:Projet clientcontrol.exe raised
exception class EsocketError with message 'can't create new socket'.Process stoped.
请问Jondona兄,该如何解决?
 
你可以检测此异常,然后重试
 
设置一个定时器,定时请求与Host建立联机,直至成功,然后关闭定时器。
注意在出错事件捕捉后要设置
ErrorCode := 0; //恢复出错码为正常

代码如下:
procedure TForm1.TimerCheckHostTimer(Sender: TObject);
begin
Sp.Panels.Items[0].Text := '正在请求与'+Client.Address+'进行连机...';
Client.Address := edHost.Text;
Client.Port := StrToInt(edPort.Text);
Client.Active:=True;
end;

procedure TForm1.ClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
var
StrErr: String;
begin
case ErrorEvent of
eeConnect: StrErr := '不能建立连接。';
eeDisconnect: StrErr := '连接被关闭。';
eeReceive: StrErr := '接收出错。';
eeSend: StrErr := '发送出错。';
else
StrErr := '连接出错。';
end;
Sp.Panels.Items[0].Text := StrErr;
ErrorCode := 0; //恢复出错码为正常
end;

procedure TForm1.ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
TimerCheckHost.Enabled := False; //关闭定时联机请求功能
Sp.Panels.Items[0].Text:='联机请求成功。';
end;

 
感谢各位大哥指导。只是分数太少,不好分配,请见谅。
 
后退
顶部