在Thread中使用TClientSocket元件的疑問?? |
尚未結案
|
tosca911
一般會員 發表:1 回覆:0 積分:0 註冊:2008-12-06 發送簡訊給我 |
各位好... 第一次上來這發言
小弟目前在寫一支程式, 目的是讀取設定檔中的主機IP/Port, 有幾台就new幾個thread出來, 然後每個thread各自產生自己的TClientSocket元件與該thread負責的主機IP/Port相連(Server端是Linux) 小弟在Thread裡面是用new TClientSocket的方式產生ClientSocket元件, 指定IP/Port之後就Open(), 但是目前遇到的問題如下: 1. 若ClientType為ctNonBlocking, 則當使用SendText或SendBuf將資訊送到Server端時, 會產生Server端收不到的問題, 而且自己寫一個method(如OnError, OnConnect)再在Thread中將Event指到這些method時, 處理OnRead, OnWrite, OnDisConnect等的method都沒有作用? 請問為何Server端收不到... 而且處理此ClientSocket元件的Event的method也都沒有用... 2. 若ClientType設為ctBlocking, 若Server端沒有Listen或沒有開機, 則ClientSocket會有10061錯誤訊息, 用Try...Catch去攔攔的到, 如果再用while包起來寫成如果產生Exception的話就close掉再retry一次, 為什麼如此retry大概十幾次之後就會停住了?(最後出現的Exception是10061連線逾時), 而且出現10061之後while就停住了... 無法繼續retry(小弟的用意是要無限retry到連通為止) 請問為什麼若連線失敗做retry的時候, 大概做個十幾次就會停住無法繼續retry@@? 3. 承2, 若ClientType設為ctBlocking, 則這個ClientSocket元件沒有event可用的情況下(因為用TWinSocketStream去做Read/Write...) 除了用Try...Catch去攔Exception之外, 還有什麼方法可以將萬一產生的Exception做處理呢? 程式碼如下(這是在Thread:Excute()裡面) [code cpp] int isOn=0, res; myClient=new TClientSocket(NULL); myClient->ClientType=ctBlocking; myClient->Address=myAddr; myClient->Port=myPort; while(1){ MainProgramForm->setGrid(myThreadSeq, "Status", "連線中"); if(isOn==0){ try{ myClient->Open(); isOn=1; } catch(...){ MainProgramForm->setGrid(myThreadSeq, "Status", "連線失敗"); myClient->Close(); Sleep(5000); } } if(isOn==1){ pStream=new TWinSocketStream(myClient->Socket, 600000); //Timeout設10min res=myClient->Socket->SendBuf("B", 2); if(res<=0){ isOn=0; MainProgramForm->setGrid(myThreadSeq, "Status", "辨識失敗"); } else{ MainProgramForm->setGrid(myThreadSeq, "Status", "連線成功"); break; } } } [/code] 當Server端不通, 會一直retry, 但是retry個十幾次之後就停住了, Sever端用netstat看並沒有任何連上的connection, 但是XP用戶端這邊卻有已經ESTABLISHED到Server端的連線... (把這段程式碼放到主Form裡面去跑就沒問題... 但是放到根據設定檔裡主機個數才new出來的thread裡面去跑卻會有問題...@@) |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |