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

處理 TServerSocket 的多個 Client 連線

 
pental
初階會員


發表:3
回覆:48
積分:30
註冊:2003-09-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-05 10:32:04 IP:211.21.xxx.xxx 未訂閱
看到很多網友問到在使用 TServerSocket 與 TClientSocket 時會遇到 ServerSocket 在擁有多個 Client 連線時,應該如何分辨 Client 呢? 分享一些我自己在一些專案上的實作經驗給大家參考一下!    首先定義一個存放Client連線資料的 Structure    struct TClientList {   TCustomWinSocket  *Socket;   AnsiString  IP;    };    然後使用 vector 來存放這些Client結構 typedef vector vtClientList; vtClientList ClientList; //定義一個 Client 串列的變數 當 ClientSocket 連線到 ServerSocket 的時候,ServerSocket會觸發OnClientConnect 的事件,在這個事件的處理函式中我們把 Socket Handle存起來。 TCustomServerSocket::OnClientConnect(TObject* Sender,CustomWinSocket* Socket) { TClientList Temp; Temp.Socket = Socket; Temp.IP = Socket->LocalAddress; ClientList.push_back(Temp); //把這個連線的資料結構存到 vector 裡面 } 經過以上的動作之後,我們就擁有目前ServerSocket所有的連線紀錄,當ServerSocket接收到資料時,會觸發 OnClientRead,這時候我們就可以去比對 Socket Handle 來辨別是哪一條連線了!透過這樣的方式,就算同一台電腦開好幾個 Client 的連線,Server端還是可以容易的分辨是哪一條連線! TCustomServerSocket::OnClientRead(TObject* Sender,CustomWinSocket* Socket) { int Size = Client.size(); for(int i=0;i
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-05 12:23:41 IP:211.21.xxx.xxx 未訂閱
不知道意思是否一樣 我的做法是: 1.現有 A,B,C 三條連線進來,都會觸發 ServerSocket1ClientRead 2.在 ServerSocket1ClientRead 中取出 Socket->RemoteAddress 就知道目前觸發 ServerSocket1ClientRead 的 IP 是多少(假設是 X ,管它 X 是A,或B,C 的 IP) 3.在目前的 Connection 找出誰的 IP 是 X , 將處理後的資料往 IP 是 X 的這個 CONNECTION 丟回去即可,保證不會丟錯人; A 觸發 ServerSocket1ClientRead , 那 X 就是 A 的 IP , B 觸發 ServerSocket1ClientRead , 那 X 就是 B 的 IP  5.不用在另外做對照表或紀錄     
 
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  int ConnectID=-1; //目前之 Socket 在 Connections 中的連結編號
  for (int i=0;iSocket->ActiveConnections;i  )
        {
          //在目前的 Connection 找出誰的 IP 是 X
          if (ServerSocket1->Socket->Connections[i]->RemoteAddress==Socket->RemoteAddress)
             {
               ConnectID=i; //找到了 X IP 的 CONNECTION ID
               break;
             }
        }      //將資料丟回觸發本事件的 CONNECTION ID
  ServerSocket1->Socket->Connections[ConnectID]->SendText("MyTest");
}
發表人 - bruce0211 於 2003/11/05 12:25:01
pental
初階會員


發表:3
回覆:48
積分:30
註冊:2003-09-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-05 13:27:36 IP:211.21.xxx.xxx 未訂閱
看了你的做法,我想意思應該是差不多囉!因為在我的程式裡面紀錄的不只有我在範例中寫到的 Socket and IP,還包括各Client擁有的變數值,所以我會這樣的寫! 照你的寫法的話,也可以把 if (ServerSocket1->Socket->Connections[i]->RemoteAddress==Socket->RemoteAddress) 改為 if (ServerSocket1->Socket->Connections[i] == Socket) 只要比對 Socket 就可以了! 感謝您的意見!
系統時間:2024-05-05 9:54:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!