请高手帮忙:在ctBloching下,用三个线程发送队列中的数据时,如何得到SOCKET的出错。 (100分)

H

hcai

Unregistered / Unconfirmed
GUEST, unregistred user!
问题:
1,为什么ClientSocket的OnError过程没有被调用。
2,当断线时,如何得到错误信息,而主界面变得象死了一样。
请高手帮忙,谢谢。
 
indy的socket有TimeOut属性,通过异常可以得到错误

-----
http://www.8421.org
 
接受也用阻塞式,放到一个线程里去,用WaitForData()函数可以设置超时,
超过一定时间就退出就可以了。
 
to 张无忌:
我是用Timer临控clientsocket的状态的,程序如下:
if (clientSCK.Active=false)and(mypush.Count>0) then
begin
clientSCK.Socket.Close;
if Timer4.Interval<>LocateTime then
Application.ProcessMessages;
clientSCK.Open;
exit;
end;
EXCEPT
clientSCK.Socket.Close;
Send_Grid.Cells[2,1]:='尝试联接...';
Send_Grid.Refresh;
END;

在线程中接收程序:
SckStream1 := TwinSocketStream.Create(BIQ2002SCK.clientSCK.Socket,TimeOut*1000);
。。。。。。。。。。。。。。。。。。
SendSucc:=SckStream1.Write(pwidechar(teststr)^,length(teststr)+1);//发送

接收:
while (not Terminated) and (clientSCK.Active) do
begin

if SckStream1.WaitForData(TimeOut*1000) then
if SckStream1.Read(rec, Length(rec)+1) <> 0 then
if length(rec)>2 then
begin
。。。。。。。。。。。。。。。。。。
请帮忙阿,谢谢!!

 
你通过SckStream1.WaitForData(TimeOut*1000)的返回值来判断是否断线呀
 
如果超时就关闭这个连接
 
你的程序可能没有错误,断线了只能在ondisconnected里面自己添加信息,
当断线后,你以去连接它,这里如果 你的程序不仅做连接,还有更多的任务
或许你的连接中加了对方主机名什么的就会变得很慢而像死机一样了。
你只有自己去了解断线原因,然后在相应断开程序中自己添回信息
 
顶部