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

Indy10的TcpServer如何監聽同IP的多個埠?

缺席
chenyk
高階會員


發表:14
回覆:94
積分:171
註冊:2002-07-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-11-09 17:51:42 IP:211.75.xxx.xxx 訂閱
我有數個Client端,同IP,但通訊埠不同。
我參考前輩們的資料,
提到TCPserver可以用bindings來監聽多個port,並給予回應。
但網路範例多是實做聊天室,也就是Clinet端同個port不同IP。
我將DefaultPort 設為 0,bindings 加入要監聽的port的清單,如下:
for n := 1 to 5 do
begin
tBind := tServer.Bindings.add;
tBind.IP := '127.0.0.1';
tBind.Port := 5000 n;
end;
但 OnExeture 卻沒收到封包,請問各位先進該如何解決?

謝謝
pcplayer99
尊榮會員


發表:142
回覆:740
積分:591
註冊:2003-01-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-11-20 15:32:39 IP:120.236.xxx.xxx 訂閱
你必须要对 TCP/IP 的基本工作原理比较有了解,才能做。

简单地说,一个 Server 就是在一台 Server 上监听一个 Port 的程式。比如,Web Server 就是工作在 Port 80 上面。当然,你要监听多个 port 也可以。那就用多个 TCP Server 元件好了。
chenyk
高階會員


發表:14
回覆:94
積分:171
註冊:2002-07-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2015-11-24 16:48:01 IP:211.75.xxx.xxx 訂閱
感謝回覆。m(__)m

我使用的是 indy 10元件,關於TCP/IP 算門外漢。
我的 server收到Client的封包後,得先回覆client 'OK'封包,接著於數秒內收取A儀器上的數據再回傳給Client,否則Client會回報逾時。
我試過1支程式上有數個 TCPserver ,也試過一server對1 port,運作時開啟數個執行檔讓它們指向不同的port。
回覆'OK'都沒有問題,主要是第二階段回傳資料給Client時,用了許多公用變數,導致系統無法穩定運作。
本來想透過單一server監聽多埠來克服資料傳遞的問題,誠如先進所言,程式無法正確判斷當前處理的Client是誰。

網上範例,資料都是在OnExeture執行結束就沒了,不知先進建議的作法?
Jasonwong
版主


發表:49
回覆:918
積分:558
註冊:2006-10-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2015-11-25 15:44:57 IP:125.227.xxx.xxx 訂閱
其實⋯⋯你可以反過來做

在 SERVER 端用 TCPClient 在 CLIENT 端用 TCPServer

由 TCPServer 傳訊息給 TCPClient,待TCPClient 處理完後再傳給 TCPServer
------
http://www.cobbler.tw

聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心
傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
chenyk
高階會員


發表:14
回覆:94
積分:171
註冊:2002-07-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2015-11-26 16:37:03 IP:211.75.xxx.xxx 訂閱
可惜的是,Client端是設備上的軟體附的,我無法變更。
整個問答順序是 1.client提出要求->2.server回應收到->等待數杪->3.server送出資料 -> 4.client回應收到。
網路上的範例只完成前兩個步驟,頂多加個廣播。
我照前輩的建議,採1server 對 1 port,基本上可達到監聽的目的,目前問題卡在第三步驟。
但我的程式在執行步驟三數次後,很容易就發生存取錯誤,造成程式停止。
個人推測是送出第一組封包後,thread收到回應而和timer同時存取同一組公用變數,
在程式撰寫上,是否可以避免或更好的作法?
dkjfso
一般會員


發表:3
回覆:21
積分:4
註冊:2005-09-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2016-02-26 10:07:42 IP:203.68.xxx.xxx 訂閱
TIdTCPServer可能同時要對好幾個Client響應

所以它的OnExecute是在Thread裡執行的

如果要存取全域變數的話

最好是用TCriticalSection避免重入(同時存取)

依您的敘述有可能是這個問題
編輯記錄
dkjfso 重新編輯於 2016-02-26 11:07:30, 註解 無‧
系統時間:2017-11-20 12:00:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!