急問~~~NMUDP接收問題 |
答題得分者是:00156
|
Elsa-fen
一般會員 發表:9 回覆:16 積分:5 註冊:2003-09-25 發送簡訊給我 |
|
00156
高階會員 發表:45 回覆:195 積分:112 註冊:2002-06-01 發送簡訊給我 |
引言: 不好意思...我現在有a,b 2台電腦同時要回傳資料給c.... 但...若a正傳送檔案給c的同時...b也要傳進來給c..程式就會出現問題.. (我只用一個nmudp的元件) 請問..這部份的問題有人遇過嗎...and..要如何解決呢..謝謝我以前的解決方法是在c宣告一個變數來記錄是否正在傳送中,當接收到傳送的request時,若處於idle狀態,即回覆"許可"的訊號,開始進行傳送,否則回覆"傳送中"的訊號,要求對方先等待,等候一定時間再重新request 不知道這個方法是否可行? |
Elsa-fen
一般會員 發表:9 回覆:16 積分:5 註冊:2003-09-25 發送簡訊給我 |
引言: 我以前的解決方法是在c宣告一個變數來記錄是否正在傳送中,當接收到傳送的request時,若處於idle狀態,即回覆"許可"的訊號,開始進行傳送,否則回覆"傳送中"的訊號,要求對方先等待,等候一定時間再重新request 不知道這個方法是否可行?我的想法也是這樣..但..不知道在delphi內要怎麼做呢..不知道有沒有人做過這方面的處理呢...<不好意思..我還是新手呢..> 不好意思..再問個問題... http://delphi.ktop.com.tw/topic.php?topic_id=26382 這篇文章中所提到的.. NMUDP2來接收, NMUDP1 的Remoteport=4001 NMUDP2 的Remoteport=4002 NMUDP1 的LocalPort=4002 NMUDP2 的LocalPort=4001 接收 NMUDP2.ReadBuffer(ReciBuf,NumberBytes); .... 是什麼意思呢..有人知道嗎?/謝謝 發表人 - elsa-fen 於 2004/03/15 23:35:04 |
00156
高階會員 發表:45 回覆:195 積分:112 註冊:2002-06-01 發送簡訊給我 |
提供一段code供您參考:
(這個程式角色和妳的相反...這是server端的程式,用來傳送檔案給client端下載的。
當接收到client端的request是"#list..."時,回傳可以下載的檔案清單;
當接收到的request是"#get..."時,開始回傳許可或拒絕的訊息給client端;
當request是"#next",表是繼續傳送目前正在下載的檔案。
)
type TForm1=class(TForm) udp: TIdUDPClient; udps: TIdUDPServer; tasklist: TListBox; //記錄Server端註冊可供下載的檔案清單 ...省略... procedure udpsUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); procedure TForm1.FormCreate(Sender: TObject); private f:file; FFileOpen:boolean; //記錄是否有檔案正在傳送 end; procedure TForm1.udpsUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); var buffer:array[0..511] of char; cmd:string; SourceFileName:TFileName; NumRead:integer; begin //取得client端的request資訊 AData.Position:=0; AData.ReadBuffer(buffer,AData.Size); cmd:=StrPas(buffer); SetLength(cmd,AData.Size); //解析request資訊 udp.Host:=Copy(cmd,7,15); {request裡的第7~21字元儲存client端的IP位置} if Pos('#list',cmd)=1 then begin try udp.Send(tasklist.Items.Text); except //ShowMessage('傳送失敗'); end; end else if Pos('#get',cmd)=1 then begin SourceFileName:=Copy(cmd,23,Length(cmd)-22); {request裡的第23字元以後是要下載的檔案名稱} if not FileExists(SourceFileName) then //檔案不存在的情形... begin udp.Send('-1'); Exit; end else if FFileOpen then //忙線中的情形... begin udp.Send('-2'); end else begin //開始傳送檔案(先傳送檔案大小的資訊給client端)... AssignFile(f,SourceFileName); Reset(f,1); FFileOpen:=true; udp.Send(IntToStr(FileSize(f))); end; end else if Pos('#next',cmd)=1 then //繼續傳送檔案資料... begin if not FFileOpen then Exit; BlockRead(f,buffer,SizeOf(buffer),NumRead); udp.SendBuffer(buffer,NumRead); if Eof(f) then begin CloseFile(f); FFileOpen:=false; end; end; end; procedure TForm1.FormCreate(Sender: TObject); begin FFileOpen:=false; end; //...其他code略...Client端在發出"#get..."訊息後依據收到的訊息(-1:檔案不存在、-2:忙線中、其他數值表示允許下載以及檔案大小)再做處理 以上程式碼未盡善之處,請多包涵 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |