全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:517
推到 Plurk!
推到 Facebook!

使用ClientSocket連接MOXA NPort偵測斷線與重新連線

尚未結案
lkkplayer
一般會員


發表:26
回覆:59
積分:17
註冊:2006-11-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2016-11-17 20:53:33 IP:114.39.xxx.xxx 未訂閱
請教各位大大,我使用ClientSocket連接MOXA NPort
剛開啟時,正常與MOXA NPort連線後,如果將MOXA NPort斷電
ClientSocket並不知道斷線了,原本以為是使用ClientSocket.Socket.Connected去判斷
但是我爬文後,這個值是最後一次連結的狀態,我之前有連成功就always是true
請問還有其他方式可以偵測嗎?另外重新連線是否就是將ClientSocket.Active:=false;
再ClientSocket.Active:=true;就是重新連線。

程式如下:
procedure TForm1.FormShow(Sender: TObject);
begin
try
NPortSocket1.Active:=false;
NPortSocket1.Host:= '192.168.1.123';
NPortSocket1.Port := 4001;
NPortSocket1.Active := True;
except
on E:exception do
begin
showMsg('NPortSocket1 開啟失敗:' E.Message);
end;
end;
end;

procedure TForm1.NPortSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
var
strTime:string;
begin
strTime:=FormatDateTime('yyyy/mm/dd hh:nn:ss-->', Now());
ShowMsg( strTime NPortSocket1.Host ' 已連線');
end;

procedure TForm1.NPortSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
showMsg(NPortSocket1.Host ' 已斷線');
end;

procedure TForm1.NPortSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
showMsg('NPortSocket1 錯誤:' IntTostr(ErrorCode));
ErrorCode:=0;
NPortSocket1.Close;
end;

procedure TForm1.NPortSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
buf : Array[1..40960] of char;
nConnect:integer;
begin
with TForm1 do
begin
sleep(50);
nConnect:=NPortSocket1.Socket.ReceiveBuf(buf, sizeof(buf));
end
end;

procedure TForm1.tmTimer(Sender: TObject);
begin
if not NPortSocket1.Socket.Connected then
begin
showMsg('NPort1:<' NPortSocket1.Host '> 已斷線');
showMsg('重新連線NPort1:<' NPortSocket1.Host '>');
try
NPortSocket1.Active:=false;
NPortSocket1.Host:='192.168.1.123';
NPortSocket1.Port := 4001;
NPortSocket1.Active := True;
except
on E:exception do
begin
showMsg('NPortSocket1 開啟失敗:' E.Message);
end;
end;
end;
end;
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2016-11-23 11:41:26 IP:210.242.xxx.xxx 未訂閱
只有採用 c 與 s 互相送心跳的通訊,才容易快速的得知問題。 要多快得知取決於送心跳的速度。每5秒送一次的話,就是每5秒就會得到一個 error 或是 disconnected 的結果。如何簡單快速的來實驗?  就是試著突然拔網路線看看,很多時候程式還是不會發現當當時沒有封包被送出時。

以上是寶貴經驗,還有更深的網路問題,一時半刻無法解通。

請參考
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
系統時間:2017-11-19 18:32:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!