線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1686
推到 Plurk!
推到 Facebook!

NMUDP Stream write error

尚未結案
hwmike6979
一般會員


發表:3
回覆:6
積分:1
註冊:2005-07-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-15 19:16:24 IP:61.218.xxx.xxx 未訂閱
請問用NMUDP來設計網路連線, 若送出STREAM時, CLIENT端未執行, 連線不成功時會出現"Stream write error"錯誤訊息,請問這個例外,如何提前攔截, 或者有其他方法可先避免訊息出現? 謝謝幫忙! 有sample code更感謝
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-08 17:48:59 IP:202.3.xxx.xxx 未訂閱
引言: 請問用NMUDP來設計網路連線, 若送出STREAM時, CLIENT端未執行, 連線不成功時會出現"Stream write error"錯誤訊息,請問這個例外,如何提前攔截, 或者有其他方法可先避免訊息出現? 謝謝幫忙! 有sample code更感謝
hwmike6979 你好:
(1)你可以利用 try...catch 語法把可能出現 exception 的程式碼給包起來,
   應該就可以達到目的
(2)以下的範例程式碼中,Sender 傳送 "test" 字串給 Receiver,Receiver 把
   接收到的字串再加上時間字串 "yyyymmddhhnnss" 之後,回傳給 Sender
// Sender
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
   NMUDP1->LocalPort=4001;
}
void __fastcall TForm1::NMUDP1DataReceived(TComponent *Sender,
      int NumberBytes, AnsiString FromIP, int Port)
{
   AnsiString szRecv;
   TMemoryStream *msRecv=NULL;       msRecv=new TMemoryStream;
   try
   {
      try
      {
         NMUDP1->ReadStream(msRecv);
         szRecv.SetLength(NumberBytes);
         msRecv->Read(&szRecv[1], NumberBytes);
         Memo1->Lines->Add("NMUDP1 recv: "+szRecv);
      }
      catch(Exception &ex)
      {
         Memo1->Lines->Add("NMUDP1 exception: "+ex.Message);
      }
   }
   __finally
   {
      delete msRecv;
   }
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   AnsiString szSend;
   TMemoryStream *msSend=NULL;       msSend=new TMemoryStream;
   try
   {
      try
      {
         szSend="test";
         msSend->Size=szSend.Length();
         msSend->Write(&szSend[1], msSend->Size);
         NMUDP1->RemoteHost="127.0.0.1";
         NMUDP1->RemotePort=4000;
         NMUDP1->SendStream(msSend);
         Memo1->Lines->Add("NMUDP1 send: "+szSend);
      }
      catch(Exception &ex)
      {
         Memo1->Lines->Add("NMUDP1 exception: "+ex.Message);
      }
   }
   __finally
   {
      delete msSend;
   }
}
// Receiver
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
   NMUDP1->LocalPort=4000;
}
void __fastcall TForm1::NMUDP1DataReceived(TComponent *Sender,
      int NumberBytes, AnsiString FromIP, int Port)
{
   AnsiString szRecv;
   AnsiString szSend;
   TMemoryStream *msRecv=NULL;
   TMemoryStream *msSend=NULL;
   TDateTime dtNow=Now();       msRecv=new TMemoryStream;
   msSend=new TMemoryStream;
   try
   {
      try
      {
         NMUDP1->ReadStream(msRecv);
         szRecv.SetLength(NumberBytes);
         msRecv->Read(&szRecv[1], NumberBytes);
         Memo1->Lines->Add("NMUDP1 recv: "+szRecv);             szSend=szRecv+"-"+dtNow.FormatString("yyyymmddhhnnss");
         msSend->Size=szSend.Length();
         msSend->Write(&szSend[1], msSend->Size);
         NMUDP1->RemoteHost="127.0.0.1";
         NMUDP1->RemotePort=4001;
         NMUDP1->SendStream(msSend);
         Memo1->Lines->Add("NMUDP1 send: "+szSend);
      }
      catch(Exception &ex)
      {
         Memo1->Lines->Add("NMUDP1 exception: "+ex.Message);
      }
   }
   __finally
   {
      delete msSend;
      delete msRecv;
   }
}
(3)請再依照自己的需求,自行修改
-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
hwmike6979
一般會員


發表:3
回覆:6
積分:1
註冊:2005-07-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-08 18:22:32 IP:61.218.xxx.xxx 未訂閱
謝謝您, 又麻煩您回答了!我試改來用, 已解決問題, 可是在除錯中也發現了另一個現象, 那就是當MNUDP發出封包沒對方回應卻在RECEIVED收到長度為-1的封包, 才造成我的解讀時STREAM ERR, 不知這是否正常?
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-04-18 17:32:36 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-05-04 17:01:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!