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

TClientSocket在連結不存在的IP時出現的問題

尚未結案
smallma
一般會員


發表:8
回覆:11
積分:3
註冊:2003-03-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-30 08:25:30 IP:211.75.xxx.xxx 未訂閱
小弟的程式使用TClientSocket來對另一台電腦做TCP連結 如果對方的IP是存在的,在運作上很正常,成功和失敗都很快就有結果 但是如果連結一個不存在的IP(可能是真的不存在、電腦關機、打錯IP或是對方有防火強),就會發生一個問題,程式會沒有回應好一陣子(大約5~10秒),然後才會有錯誤訊息 能不能讓它那個5~10秒的時間能縮短呢,在嘗試連結1~2秒無法建立連結就將錯誤訊息傳回呢???
SnoopyChen
一般會員


發表:1
回覆:17
積分:18
註冊:2003-07-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-31 00:00:25 IP:211.21.xxx.xxx 未訂閱
我想我給你的答覆是無法滿足你的, 但我只是想說一個觀念: TCP/IP當初設計 的目的就是要解決如何在不穩定的通訊上, 如何儘可能完成通訊的任務, 因此 不該強求把它當成即時能反應的處理來看待, 像是: 為何對方斷線而我有時要 過很久才知道, 甚至可能一直都不知道等。 也許歷經了20多年(或30多年?)的演變, 如今在線路傳輸品質已大幅提昇, 但 在基本的TCP/IP原理上仍無太大的改變, 也許微軟在WinSock2上多了許多當初 BSD Socket Library沒有的功能, 我不知是否有可以達成你要的功能... 一個Connect會失敗有許多的可能: 1.不存在的IP, 必須要經由routing到TTL用盡, 這時要要看你封包經過的節點 是怎樣轉送這個封包, 所以時間並不一定。 2.對方有防火牆: 可能直接拒?(reject)你的封包, 這時你馬上會收到一個錯 誤回應; 若是它丟棄(drop)你的封包, 那麼按TCP/IP原則, 那就有得等了, 這時要看你的系統是如何設定這個的等待時間。 3.對方電腦關機: 那結果就像是被防火牆drop掉的封包一樣。 4.其他... 有本書提到不少你需要的技巧, 但這是用C寫的, 不知是否適合你: [Effective TCP/IP Programming -- 44 Tips to Improve Your Network Programs] 作者網站: http://www.netcom.com/~jsnader 繁體版譯者:林洙如
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-31 08:16:19 IP:202.39.xxx.xxx 未訂閱
可改用 indy 的 TIdTcpClient 元件, 它有 Timeout 值可使用 TIdTcpClient.Connect(const ATimeout: Integer);    -- 向 KTop 的弟兄們致敬! 
stchen
一般會員


發表:0
回覆:2
積分:0
註冊:2002-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-04 00:11:47 IP:61.64.xxx.xxx 未訂閱
先使用 ping 檢查主機是否存在 ics 套件使用 ping -> timeout 可設定短些 1000 = 1 sec indy 套件使用 icmp -> receivetimeout 可設定短些 1000 = 1 sec 主機若存在再用 TclientSocket 連接
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-04 17:15:37 IP:220.130.xxx.xxx 未訂閱
引言: 先使用 ping 檢查主機是否存在 ics 套件使用 ping -> timeout 可設定短些 1000 = 1 sec indy 套件使用 icmp -> receivetimeout 可設定短些 1000 = 1 sec 主機若存在再用 TclientSocket 連接
smallma 您好: 借花獻彿,具體實現 stchen 兄所言 (若 icmp 被防火牆檔掉,但 Server Alive,這樣會認為 Server 沒有存在),忘了這是哪個大大在某篇討論中,我稍微修改後放入自己的 Lib 內 ..
function PingAlive(const AHost: string; const ATimeout: Cardinal = 1000):
  boolean;
var
  IdIcmpClient: TIdIcmpClient;
begin
  try
    IdIcmpClient := TIdIcmpClient.Create(nil);
    IdIcmpClient.ReceiveTimeout := ATimeout; //設定回應的等候時間
    IdIcmpClient.Host := AHost;
    Result := true;
    try
      IdIcmpClient.Ping;
    except
      Result := false;
    end;
  finally
    FreeAndNil(IdIcmpClient);
  end;
end;    function CheckServerAlive(const AHost: string; const APort: integer): boolean;
var
  IdTCPClient: TIdTCPClient;
begin
  Result := false;      if not PingAlive(AHost) then
    Exit;      try
    IdTCPClient := TIdTCPClient.Create(nil);
    IdTCPClient.Host := AHost;
    IdTCPClient.Port := APort;        try
      IdTCPClient.Connect;
      Result := true;
    except
      Result := false;
    end;
    IdTCPClient.Disconnect;
  finally
    FreeAndNil(IdTCPClient);
  end;
end;
---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- 發表人 - SouthWind 於 2004/08/04 17:24:07
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-04-26 13:51:35 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-05-19 10:15:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!