詣問一個TClientSocket的接收資料問題 |
答題得分者是:RaynorPao
|
kenbcb
中階會員 發表:171 回覆:129 積分:60 註冊:2003-07-15 發送簡訊給我 |
請問各位~ 如何利用TClientSocket接收自定的buffer的資料~而且將其拆成二次讀取.
假設有二個buffer大小各為15,23Byte,但其同點為前4byte是一樣的,而在4byte中有2byte是在說明第二次讀取的長度分別為11,19.~請問各位能夠指導,希望有範例說明,以便了解.~謝謝 簡單表示:
有一buffer為15byte,而第一次讀取只要讀前4byte(其中2byte是在宣告第二次存取的長度),第二次讀取後面的11byte. 發表人 - kenbcb 於 2003/08/07 17:30:25
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 請問各位~ 如何利用TClientSocket接收自定的buffer的資料~而且將其拆成二次讀取. 假設有二個buffer大小各為15,23Byte,但其同點為前4byte是一樣的,而在4byte中有2byte是在說明第二次讀取的長度分別為11,19.~請問各位能夠指導,希望有範例說明,以便了解.~謝謝 簡單表示: 有一buffer為15byte,而第一次讀取只要讀前4byte(其中2byte是在宣告第二次存取的長度),第二次讀取後面的11byte.kenbcb 你好: 請參考以下的範例程式碼 < class="code"> // Server __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { ServerSocket1->Port=4000; ServerSocket1->Open(); } __fastcall TForm1::~TForm1() { ServerSocket1->Close(); } void __fastcall TForm1::Button1Click(TObject *Sender) { WORD wLen=11; BYTE *b=new BYTE[11 4]; b[0]='X'; b[1]='X'; *(b 2)=wLen; for(int i=0; i<11; i ) { *(b 4 i)=i; } ServerSocket1->Socket->Connections[0]->SendBuf(b, 11 4); delete b; } // Client __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { ClientSocket1->Address="192.168.1.1"; ClientSocket1->Port=4000; ClientSocket1->Open(); } __fastcall TForm1::~TForm1() { ClientSocket1->Close(); } void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { BYTE b[1024]={0}; Socket->ReceiveBuf(b, 1024); if(b[0]=='X' && b[1]=='X') { WORD *wLen=(WORD*)(b 2); TMemoryStream *ms=new TMemoryStream; ms->Size=*wLen; ms->Write(b 4, *wLen); ms->SaveToFile("FromServer.dat"); delete ms; } } -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
kenbcb
中階會員 發表:171 回覆:129 積分:60 註冊:2003-07-15 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 請問: (1) client那b[1024]的1024,為什麼要怎麼用?? (2) 我要把第二次讀的資料,以動能陣列存起來,要如何做;不是存成檔案? (3) 在收資料時,是一次收進來嗎? (4) 可以介紹書或網站,讓我了解網路程式,因我對寫網路程式有興趣(tcp/ip,udp...等) 謝謝... kenbcb 你好: (1)1024 是小弟我用來暫存的 buffer (2)TMemoryStream 本身就是類似陣列的東西,如果不想使用,也可以寫成這樣 (其中 a 就是你想要的 BYTE array) void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { BYTE b[1024]={0}; Socket->ReceiveBuf(b, 1024); if(b[0]=='X' && b[1]=='X') { WORD *wLen=(WORD*)(b 2); BYTE *a=new BYTE[*wLen]; CopyMemory(a, b 4, *wLen); // Do something...... delete a; } } (3)是 (4)看這一本 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=23293-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
kenbcb
中階會員 發表:171 回覆:129 積分:60 註冊:2003-07-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |