請教TTcpServer元件內部實作問題? |
尚未結案
|
iamjsn
初階會員 ![]() ![]() 發表:78 回覆:95 積分:44 註冊:2002-08-16 發送簡訊給我 |
最近在研究TTcpServer元件,發現幾個地方,一直沒辦法了解
因為對socket的關念不是粉清楚,想請教一下先進元件裏幾段source的用意 //問題一:FetchClientSocketThread的作用
TTcpServer元件Create了一個thread(TServerSocketThread)去作listen和accept,Execute裏有一個FetchClientSocketThread,它的實作用意我一直看不懂,我測試時同一隻Client端程式,先後連上Server 3次,發現FetchClientSocketThread只有第一次連線時會跑進去
而且裏面有一段
FPoolIndex := (FPoolIndex + 1) mod FThreadPool.Count;
更不知它寫成這樣的用意是什麼,看不懂??? //問題二:TServerSocketThread.FThreadPool扮演的角色
還有一個問題就是TServerSocketThread裏有一個FThreadPool: TList;變數,但發現它只有在AddClientSocketThread才會做add,我測試時Client端連上來三次,也只始終add過一次,不知這個FThreadPool何時才會被ADD多次,它的作用是什麼??
//----------------------------------------------------------- procedure TServerSocketThread.Execute; var T: TClientSocketThread; begin while not Terminated and Assigned(FServerSocket) and FServerSocket.Listening do begin if FServerSocket.WaitForConnection then //等待connect if not Terminated then begin T := FetchClientSocketThread; // ??這段實作看不懂,貼在下面 if not Assigned(T) then T := AddClientSocketThread;//??這裏會做FThreadPool.add if Assigned(T) then T.Resume; Sleep(0); end; end; end; //-------------------------------------------------------------- function TServerSocketThread.FetchClientSocketThread: TClientSocketThread; var IndexRef: Integer; begin Result := nil; if Assigned(FServerSocket) and (FThreadPool.Count > 0) then begin IndexRef := FPoolIndex; repeat FPoolIndex := (FPoolIndex 1) mod FThreadPool.Count; //這段用意是在做什麼?? Result := FThreadPool[FPoolIndex]; until (FPoolIndex = IndexRef) or Result.Suspended; if not Result.Suspended then Result := nil; end; end; |
ddy
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
iamjsn 你好
一、FetchClientSocketThread 接收來自Client 的連線,因為是Thread 有可能有許多個client 同時連入
但是程式裡,使用輪詢處理
例:
FPoolIndex := (FPoolIndex + 1) mod FThreadPool.Count; mod 的妙用在於此,假設FThreadPool.Count=10;若有15條連線,超過FThreadPool.Count時,
就是說…它同時間內 FPoolIndex 的編號只有0~9,超過9 的,我想猜應該是不會被處理吧 二、這個應該是"連線數"-->同時在線上的client 數,
而不是"連線次數"--->client 登入幾次
一個連線,連上時…它會增加一次,換句話說,你如果同時開三、四個client
它應該會顯多個連線(三、四個) PS:這是我用Indy 9.0 的 TCPServer /TCPClient 的心得:p
不知道有沒有一樣?
|
Ktop_Robot
站務副站長 ![]() ![]() 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |