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

如何寫連接多個TcpClient(不同埠號)的Tcpserver

缺席
chenyk
高階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-11-03 11:09:29 IP:211.75.xxx.xxx 訂閱
我使用Delphi7內建的TTCPServer元件建立tcpserver,Client端是機器上的PC,它提供5個 tcpclient 收/送封包
每個tcpclient 的 port 都不同(10001~10005)。
我嘗試 1 對 1 連線,可以正常作業,
但我設置5個tcpserver ,來對應每一個port,跑一段時間就會出現記憶體存取錯誤,存取log也很容易出現 I/O Error 32。
之後我將tcpserver 執行檔複製5份,一個執行檔對應一個port,
雖然不再記憶體錯誤,接收個幾次之後,某幾支server就沒有回應(無窮迴圈?),從log觀察,server似乎會收到別的port的封包。
請問是否server 程式架構上有問題,我該如何讓它可以作業?

Client端是機器附的,所以只能修改 server 來配合它。
底下源碼是server接收封包的事件:
[code delphi]
procedure TTcpMastBase.DoOnAccept(Sender: TObject; ClientSocket:
TCustomIpClient);
var
nLen, nSocketID: Integer;
nCheckSum: Byte;
aRecordBuf: TByteDynArray;
begin
with ClientSocket, Self.ServerSocketThread do
begin
nSocketID := ThreadPool.IndexOf( GetThreadObject);
m_nTrsState := TRS_STANDBY;
//
while( Connected AND Link) do
begin
if ( m_nTrsState = TRS_STANDBY)then
begin
FillMemory( @m_aRecData[ 0], Length( m_aRecData) *SizeOf( Byte), $0);
nLen := ReceiveBuf( m_aRecData, SizeOf( m_aRecData));
if ( nLen < 1)then
Continue;

SetLength( aRecordBuf, nLen);
CopyMemory( aRecordBuf, @m_aRecData[ 0], nLen);
end;
//拆解封包資料
nLen := SplitData( aRecordBuf);
if ( nLen > 0)then
begin
SendBuf( m_aSendData[ 0], nLen);
end;
end; //while loop end
end;
end;
[/code]

chenyk
高階會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-11-09 17:38:55 IP:211.75.xxx.xxx 訂閱
參考網路上的資料,改用indy試試。
感謝各位關注。
系統時間:2024-04-26 8:34:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!