TClientSocket在連結不存在的IP時出現的問題 |
尚未結案
|
smallma
一般會員 ![]() ![]() 發表:8 回覆:11 積分:3 註冊:2003-03-05 發送簡訊給我 |
|
SnoopyChen
一般會員 ![]() ![]() 發表:1 回覆:17 積分:18 註冊:2003-07-24 發送簡訊給我 |
我想我給你的答覆是無法滿足你的, 但我只是想說一個觀念: 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 發送簡訊給我 |
|
stchen
一般會員 ![]() ![]() 發表:0 回覆:2 積分:0 註冊:2002-12-15 發送簡訊給我 |
|
seaturn99
版主 ![]() ![]() ![]() ![]() 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: 先使用 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |