修改自VCL Source的自製CsScktServer(含Source) |
|
G01
高階會員 ![]() ![]() ![]() ![]() 發表:249 回覆:379 積分:215 註冊:2002-05-21 發送簡訊給我 |
|
G01
高階會員 ![]() ![]() ![]() ![]() 發表:249 回覆:379 積分:215 註冊:2002-05-21 發送簡訊給我 |
ScktSrvr問題之一在於經由ServerSocket所配置的執行緒,遇到Client端斷線時,它的
執行緒並沒有被釋放, 此外,因為又有做執行緒之間的訊息同步,所以造成整體效率不彰 並容易掛機的原因.....相關程式碼如下: procedure TSocketDispatcherThread.ClientExecute; var Data: IDataBlock; msg: TMsg; Obj: ISendDataBlock; Event: THandle; WaitTime: DWord; begin CoInitialize(nil); try Synchronize(AddClient); FTransport := CreateServerTransport; try Event := FTransport.GetWaitEvent; PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE); GetInterface(ISendDataBlock, Obj); if FRegisteredOnly then FInterpreter := TDataBlockInterpreter.Create(Obj, SSockets) else FInterpreter := TDataBlockInterpreter.Create(Obj, ''); try Obj := nil; (* if(FTimeout = 0)then WaitTime := INFINITE else WaitTime := 60000; *) //================================================================================ //雖然我們避開了針對各執行緒間進行訊息傳遞的等待時間,但是這是否會對於 //RemoteDataModule之間各Client端造成重大的影響,尚待驗證 while not Terminated and FTransport.Connected do begin try Data := FTransport.Receive(False, 0); if Assigned(Data) then begin FLastActivity := Now; FInterpreter.InterpretData(Data); Data := nil; FLastActivity := Now; end; except //若接收自Client端的訊息發生錯誤時,終止連線 FTransport.Connected := False; //同時,結束為這個Client端所創建的執行緒!! self.Terminate; end; end; (* 此段功能為做到執行緒之間訊息的傳遞, try case MsgWaitForMultipleObjects(1, Event, False, WaitTime, QS_ALLEVENTS) of WAIT_OBJECT_0: begin WSAResetEvent(Event); Data := FTransport.Receive(False, 0); if Assigned(Data) then begin FLastActivity := Now; FInterpreter.InterpretData(Data); Data := nil; FLastActivity := Now; end; end; WAIT_OBJECT_0 1: begin while PeekMessage(msg, 0, 0, 0, PM_REMOVE) do DispatchMessage(msg); end; WAIT_TIMEOUT: begin if(FTimeout > 0)and((Now - FLastActivity) > FTimeout)then begin FTransport.Connected := False; self.Terminate; end;//if...end!! end; else DispatchMessage(msg); end;//case...end!! except FTransport.Connected := False; self.Terminate; end; *) //================================================================================ finally FInterpreter.Free; FInterpreter := nil; end; finally FTransport := nil; end; finally CoUninitialize; Synchronize(RemoveClient); end; end; |
G01
高階會員 ![]() ![]() ![]() ![]() 發表:249 回覆:379 積分:215 註冊:2002-05-21 發送簡訊給我 |
|
G01
高階會員 ![]() ![]() ![]() ![]() 發表:249 回覆:379 積分:215 註冊:2002-05-21 發送簡訊給我 |
另外,針對安全的部份;可以在下列的程式碼當中就進行IP的過濾
procedure TSocketDispatcher.GetThread(Sender: TObject; ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread); var HostStr:string; begin //取得連線用戶的IP位址 HostStr := ClientSocket.RemoteHost; //針對ip進行比對,若符合為被允許的IP,就建立Thread SocketThread := TSocketDispatcherThread.Create(False, ClientSocket, InterceptGUID, Timeout, SocketForm.RegisteredAction.Checked, SocketForm.AllowXML.Checked); //否則,就直接關閉遠端的連線-->ClientSocket.Close; end; |
taishyang
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
GrandRURU
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
|
G01
高階會員 ![]() ![]() ![]() ![]() 發表:249 回覆:379 積分:215 註冊:2002-05-21 發送簡訊給我 |
|
dky
一般會員 ![]() ![]() 發表:12 回覆:30 積分:13 註冊:2004-06-24 發送簡訊給我 |
各位好, 目前我使用ClientDataSet搭配scktsrvr.exe遇到一個粉頭痛的問題, 不小得各位先進有沒有相同的經驗及解決方法.
我遇到連續Connect及Disconnect多次後, 在斷線時會停留大概3分多鐘才會回應回來, 讓人感覺程式當掉了. 也就是執行到SocketConnection1.Connected := False; 就停住粉久才回來... 請問有誰知道會是啥問題嗎, 我換過這一版的CsScktSrvr也一樣的狀況. 感謝大家. ===================引 用 G01 文 章=================== 歡迎大家反映使用TSocketConnection的狀況是否有改善,目前測試CsScktSerer已經非常穩定!! 除了在頻寬不足的網路狀況下反映遲緩之外,還算理想 |
G01
高階會員 ![]() ![]() ![]() ![]() 發表:249 回覆:379 積分:215 註冊:2002-05-21 發送簡訊給我 |
|
dky
一般會員 ![]() ![]() 發表:12 回覆:30 積分:13 註冊:2004-06-24 發送簡訊給我 |
|
macchen
初階會員 ![]() ![]() 發表:66 回覆:102 積分:33 註冊:2006-07-07 發送簡訊給我 |
|
dky
一般會員 ![]() ![]() 發表:12 回覆:30 積分:13 註冊:2004-06-24 發送簡訊給我 |
請問各位大大, 大家有類似的經驗跟解決之道嗎?
感謝大家... ===================引 用 dky 文 章=================== 各位好, 目前我使用ClientDataSet搭配scktsrvr.exe遇到一個粉頭痛的問題, 不小得各位先進有沒有相同的經驗及解決方法. 我遇到連續Connect及Disconnect多次後, 在斷線時會停留大概3分多鐘才會回應回來, 讓人感覺程式當掉了. 也就是執行到SocketConnection1.Connected := False; 就停住粉久才回來... 請問有誰知道會是啥問題嗎, 我換過這一版的CsScktSrvr也一樣的狀況. 感謝大家. ===================引 用 G01 文 章=================== 歡迎大家反映使用TSocketConnection的狀況是否有改善,目前測試CsScktSerer已經非常穩定!! 除了在頻寬不足的網路狀況下反映遲緩之外,還算理想 |
G01
高階會員 ![]() ![]() ![]() ![]() 發表:249 回覆:379 積分:215 註冊:2002-05-21 發送簡訊給我 |
|
dky
一般會員 ![]() ![]() 發表:12 回覆:30 積分:13 註冊:2004-06-24 發送簡訊給我 |
|
dky
一般會員 ![]() ![]() 發表:12 回覆:30 積分:13 註冊:2004-06-24 發送簡訊給我 |
|
老大仔
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
應該是以下:
delphi.ktop.com.tw/board.php ===================引 用 dky 文 章=================== 請問有消息嗎?? ===================引 用 dky 文 章=================== 請問您問題點是在哪, 新的版本放在哪邊 因我後來有再自己加了一些功能進去, 所以想直接修正掉問題點即可. 目前常遇到Connect或DisConnect都要好久才回應,讓使用者覺得好像當機了. 感謝您~~ ===================引 用 G01 文 章=================== To dky: 已經找到問題點並且修正了,去下載新的版本吧。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |