線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3058
推到 Plurk!
推到 Facebook!

無法取得TIdTelnet的回應內容

缺席
JammyHsu
一般會員


發表:14
回覆:39
積分:10
註冊:2003-09-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-10 17:25:33 IP:140.128.xxx.xxx 未訂閱
我將原本放在mainform的telnet程式改放到dll裡 結果OnDataAvailable都無法收到訊息 等到timeout後, 出現訊息視窗, 才收到回應 我在想是不是Application.ProcessMessages這邊廻圈的問題 但是廻圈拿掉就也是不等回應就結束了 如同之前發問的問題一樣 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=46220 煩請前輩們賜教!    程式如下:   TelnetPrompt : array [1..3] of String = ('login:', 'password:', '@mail)/');    function Telnet(const tServer: String; const tPort: Integer; const tCmdList: TStringList): Boolean; var i, j: Integer; CmdStr: String; BeginTick: DWORD; dmTelnet: TInternetDM; begin Result:=False; dmTelnet:=TInternetDM.Create; with dmTelnet.IdTelnet1 do begin Host:=tServer; Port:=tPort; try if Connected then Disconnect; TelnetFlag:=False; Connect; for i:=0 to tCmdList.Count-1 do begin Result:=False; CmdStr:=tCmdList.Strings[i]; BeginTick:=GetTickCount; while (not TelnetFlag) and (GetTickCount - BeginTick < 10000) do // 收到提示訊息 或 超過10秒 Application.ProcessMessages; if not TelnetFlag then begin ShowMessage('等待訊息已超過預設10秒鐘' #13 '可能斷線或忙線或語法不合, 將強制中斷' #13 '目前停留在 [' CmdStr ']'); break; end; for j:=1 to Length(tCmdList.Strings[i]) do SendCh(CmdStr[j]); SendCh(#13); TelnetFlag:=False; Result:=True; end; Disconnect; except on E: Exception do ErrorMessage('遠端控制命令傳送失敗:' E.Message); end; end; end; procedure TInternetDM.IdTelnet1DataAvailable(Sender: TIdTelnet; const Buffer: String); var i: Integer; sBuf: String; begin sBuf:=LowerCase(Trim(sBuf)); if sBuf='' then exit; for i:=1 to Length(TelnetPrompt) do if Pos(TelnetPrompt[i], Buffer)>0 then begin TelnetFlag:=True; break; end; end;
JammyHsu
一般會員


發表:14
回覆:39
積分:10
註冊:2003-09-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-11 09:47:16 IP:140.128.xxx.xxx 未訂閱
不知道算不算解決了 我在 Application.ProcessMessages 後面加入 Application.HandelMessage 就可以取得回應訊息 只是速度上沒有直接加在mainform裡快 有時還會執行一半一樣中途超過timeout(10秒) 不知各位前輩還有無其他更好的方法
JammyHsu
一般會員


發表:14
回覆:39
積分:10
註冊:2003-09-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-11 21:46:50 IP:163.28.xxx.xxx 未訂閱
訂正 是Application.HandleMessage Development Expert Legend Philosopher Human Intelligent
zycagod
一般會員


發表:0
回覆:14
積分:12
註冊:2002-07-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-15 14:26:32 IP:61.30.xxx.xxx 未訂閱
sBuf:=LowerCase(Trim(sBuf)); if sBuf='' then exit;    這個sBuf有何用途呢? 還是你是要寫成    procedure TInternetDM.IdTelnet1DataAvailable(Sender: TIdTelnet; const Buffer: String); var i: Integer; sBuf: String; begin sBuf:=LowerCase(Trim(Buffer));       ----> if sBuf='' then exit; for i:=1 to Length(TelnetPrompt) do if Pos(TelnetPrompt[i], sBuf)>0 then   ----> begin TelnetFlag:=True; break; end; end;        
JammyHsu
一般會員


發表:14
回覆:39
積分:10
註冊:2003-09-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-16 09:49:20 IP:61.30.xxx.xxx 未訂閱
引言: sBuf:=LowerCase(Trim(sBuf)); if sBuf='' then exit; 這個sBuf有何用途呢? 還是你是要寫成 procedure TInternetDM.IdTelnet1DataAvailable(Sender: TIdTelnet; const Buffer: String); var i: Integer; sBuf: String; begin sBuf:=LowerCase(Trim(Buffer)); ----> if sBuf='' then exit; for i:=1 to Length(TelnetPrompt) do if Pos(TelnetPrompt[i], sBuf)>0 then ----> begin TelnetFlag:=True; break; end; end;
哦, sorry! 因為前面幾行是直接用打的, 不是從程式上copy的 原本就是如同---->處的寫法, 將Buffer改成sBuf Development Expert Legend Philosopher Human Intelligent
zycagod
一般會員


發表:0
回覆:14
積分:12
註冊:2002-07-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-16 10:05:20 IP:61.30.xxx.xxx 未訂閱
==================================== SendCh(CmdStr[j]); 每送一個字元後等1秒到兩秒 如果這樣可以的話,那就是你也要比Echo. 至少電腦key字比手動Key字還快.
JammyHsu
一般會員


發表:14
回覆:39
積分:10
註冊:2003-09-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-03-16 10:43:40 IP:218.162.xxx.xxx 未訂閱
引言: ==================================== SendCh(CmdStr[j]); 每送一個字元後等1秒到兩秒 如果這樣可以的話,那就是你也要比Echo. 至少電腦key字比手動Key字還快.
呃......不太懂你的意思 (所有要sendch的內容都已建立) 沒有加入HandleMessage時 connect後本來應該要出現login:然後才SendCh, 可是沒有 所以我加入一個10秒等待echo迴圈, 如果沒有迴圈, 所有的訊息會一次送完 但是呢, 只有processmessages時, 結果都卡在迴圈裡 等到了10秒之後中斷, 秀出中斷訊息(ShowMessage) 結果竟然收到echo了(OnDataAvailable) 我很苦惱的是, 我要讓回應的訊息有其中幾個狀態(login, password, @mail)(帳號, 密碼, 提示字) 才送出命令 但是又不能讓程式停頓 後來我在想, 是不是因為原本idtelnet放在mainform裡 所以有mainform有收到訊息, 也正常啟動mainform.ondataavailable 搬到dll裡 反而不能正常觸發tinternetdm.ondataavailable 那如果我找一個可以trigger mainform, 是不是就可以了呢? 加入HandleMessage才有改善 這樣有了嗎? 我說得混亂 大家聽得模糊 仍感謝大家的提示解惑 *********************** 跟寫程式一樣,想不出來!
JammyHsu
一般會員


發表:14
回覆:39
積分:10
註冊:2003-09-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-03-16 11:32:55 IP:61.30.xxx.xxx 未訂閱
既然有了開頭, 就再研究下去 加入Application.HandleMessage後, 只要移動滑鼠就可以trigger 所以Application.ProcessMessages可以移除 如下篇文章有過討論 http://delphi.ktop.com.tw/topic.php?topic_id=21123 那如果不移動滑鼠, 加入一個Timer固定時間自動 SendMessage(Application.Handle, 0, 0, 0); 也可以 言而總之 只有Application.ProcessMessages並不能解決我的問題 ProcessMessages加Timer並沒有用, 移動滑鼠也沒用 HandleMessage加Timer自動, 移動滑鼠算手動 就醬子 *********************** 跟寫程式一樣,想不出來!
Henrycs0421
一般會員


發表:1
回覆:1
積分:0
註冊:2005-07-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-27 19:00:00 IP:222.86.xxx.xxx 未訂閱
不知道楼主解决这个问题没有? 这个问题也困扰我了很久,最近发现可以这样来解决: 说了很简单就是在发送命令之间增加间隔时间,当然 Application.HandleMessage还是要用的。     SendCmd(CmdStr01); Sleep(2000); //一般情况下间隔时间设为2秒就可以了 Sendcmd(CmdStr02);    初来乍到,冒昧回复,包涵!< >< > 發表人 -
JammyHsu
一般會員


發表:14
回覆:39
積分:10
註冊:2003-09-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-08-01 09:06:39 IP:140.128.xxx.xxx 未訂閱
因為事隔太久了 我也幾乎忘了這段程式的存在 基本上我是用我自己的方法 另外, zycagod提的方法 跟我想解決的問題應該不同 所以只能缺席了 ********************************** 做簽名檔就跟寫程式一樣,想不出來!
系統時間:2024-05-17 11:09:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!