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

請大家幫我查一下到底是什麼原因(有關ClientSocket及ServerSocket)

缺席
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-09 09:02:27 IP:61.220.xxx.xxx 未訂閱
小弟想要利用ClientSocket及ServerSocket寫一個程式,由伺服器傳送檔案或圖片給用戶端,參考了版上的文章東拼西湊,起初可以動作,但是由於原本路徑字元數限制太小,所以像是c:\my document\xxxx.xxx就會出錯。於是改成下面的方式,但是卻連原本的c:\000.xxx也不行傳送了,錯誤出現在用戶端接收時,header file有關檔案大小的部分出錯,造成out of memory的錯誤,小弟笨拙,查不出原因來,還請版主或眾家高手有空的時候幫我看一下,先說聲謝啦!    伺服器端主要程式碼 void __fastcall TForm1::Button1Click(TObject *Sender) {    TMemoryStream *msFile=new TMemoryStream;    OpenDialog1->Filter = "*.jpg";    if (OpenDialog1->Execute())        msFile->LoadFromFile(OpenDialog1->FileName);    MYPACK mp;    int i=0;    int block=(msFile->Size%MAX_DATASIZE==0)?       msFile->Size/MAX_DATASIZE: msFile->Size/MAX_DATASIZE+1;       for(i=0; iFileName.c_str()); mp.dwPackTotal=block; mp.dwPackCount=i; mp.dwTotalDataSize=msFile->Size; mp.dwThisDataSize=((i 1)*MAX_DATASIZE>msFile->Size)? msFile->Size-i*MAX_DATASIZE: MAX_DATASIZE; msFile->Position=i*MAX_DATASIZE; msFile->Read(mp.pbThisData, mp.dwThisDataSize); int tmp = sizeof(MYPACK); ServerSocket1->Socket->Connections[0]->SendBuf(&mp, sizeof(MYPACK)); Sleep(10); } StatusBar1->SimpleText = OpenDialog1->FileName "(" mp.dwTotalDataSize "Byte)傳送完成" ; delete msFile; } 用戶端主要程式碼 void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { MYPACK mp; Socket->ReceiveBuf(&mp, sizeof(MYPACK)); AnsiString sz=(AnsiString)mp.szHeader; if(sz.SubString(1, 4)=="FILE") { if(sz=="FILE-START") { msFile->Size=mp.dwTotalDataSize; msFile->Position=0; } msFile->Write(mp.pbThisData, mp.dwThisDataSize); if(sz=="FILE-END") { msFile->Position=0; msFile->SaveToFile(mp.szFileName); AnsiString ext = ExtractFileExt(mp.szFileName); if (ext == ".bmp") showBitmap(); else if (ext == ".jpg") showJPEG(); msFile->Clear(); } } } MYPACK的定義如 #define MAX_STRLEN 255 <==原本作者的設定為16 #define MAX_FILENAME_LEN 255 <==原本作者的設定為16 #define MAX_DATASIZE 1024 typedef struct _MyPack { char szHeader[MAX_STRLEN]; char szFileName[MAX_FILENAME_LEN]; DWORD dwPackTotal; DWORD dwPackCount; DWORD dwTotalDataSize; DWORD dwThisDataSize; BYTE pbThisData[MAX_DATASIZE]; } MYPACK; 發表人 - danielj 於 2003/07/09 09:07:36
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-09 09:14:09 IP:61.220.xxx.xxx 未訂閱
抱歉! 原來我在ServerSocket所定義的MYPACK與在ClientSocket所定義的MYPACK中的陣列數值有不同,所以才會造成用戶端在接收時誤判,導致out of memory錯誤! 很抱歉,佔用大家的版面,也謝謝大家花時間來幫我來檢查…
系統時間:2024-05-05 18:34:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!