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

BCB用socket寫Client/Sever檔案傳輸的問題...

尚未結案
shadowjosh
一般會員


發表:2
回覆:0
積分:0
註冊:2005-04-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-26 16:26:11 IP:61.64.xxx.xxx 未訂閱
請各位高手幫忙看一下,不知道為什麼區域網路內對傳就可以成功但對外網路就不能...    Client端:    //---------------------------------------------------------------------------    #include  #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; TMemoryStream *msFile; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { if(OpenPictureDialog1->Execute()){ Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName); Edit3->Text=OpenPictureDialog1->FileName; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { if( Edit1->Text!="" && Edit2->Text!="") { ClientSocket1->Address=Edit1->Text; ClientSocket1->Port=StrToInt(Edit2->Text); ClientSocket1->Active=true; StatusBar1->SimpleText=" 連 線 中 !!"; msFile=new TMemoryStream; Button3->Enabled=true; } else MessageBox(NULL,"請輸入IP 及 Port ! ! ! ","Error",MB_OK); if(ClientSocket1->Active) { ClientSocket1->Close(); StatusBar1->SimpleText=" 斷 線 ! ! !"; Button3->Enabled=false; } } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Connecting(TObject *Sender, TCustomWinSocket *Socket) { Button1->Enabled=false; } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Error(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) { Memo1->Lines->Add(AnsiString("Error:") ErrorCode); ErrorCode = 0; //以免出現錯誤訊息 } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Button3->Enabled=false; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { TMemoryStream *msFile=new TMemoryStream; msFile->LoadFromFile(Edit3->Text); MYPACK mp; int block,i; //設定有幾個封包 if(msFile->Size%MAX_DATASIZE==0) block=msFile->Size/MAX_DATASIZE; else block=msFile->Size/MAX_DATASIZE 1; ProgressBar1->Max=block; //設定Header for(i=0; iChecked==true) mp.dwkind=1; else mp.dwkind=2; mp.dwPackTotal=block; mp.dwPackCount=i; mp.dwTotalDataSize=msFile->Size; if((i 1)*MAX_DATASIZE>msFile->Size) mp.dwThisDataSize=msFile->Size-i*MAX_DATASIZE; else mp.dwThisDataSize=MAX_DATASIZE; msFile->Position=i*MAX_DATASIZE; msFile->Read(mp.pbThisData, mp.dwThisDataSize); ClientSocket1->Socket->SendBuf(&mp, sizeof(MYPACK)); Sleep(5); ProgressBar1->Position ; } ProgressBar1->Position=0; delete msFile; } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender, TCustomWinSocket *Socket) { StatusBar1->Panels->Items[0]->Text=" 斷 線 "; } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Connect(TObject *Sender, TCustomWinSocket *Socket) { StatusBar1->Panels->Items[0]->Text=" 連 線 中 "; } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { Memo1->Lines->Add(Socket->ReceiveText()); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button4Click(TObject *Sender) { Memo1->Lines->Clear(); } //--------------------------------------------------------------------------- Sever端: //--------------------------------------------------------------------------- #include #pragma hdrstop #include "Division_cut.cpp" #include #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; TMemoryStream *msFile=NULL; Division *image_w=NULL; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { ServerSocket1->Port=9999; ServerSocket1->Active=true; msFile=new TMemoryStream; } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) { int k,i,*x,*Result,*space,j; char *WordSpace; 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; Label1->Caption=" 接 收 中 "; ProgressBar1->Max=mp.dwPackTotal; } msFile->Write(mp.pbThisData, mp.dwThisDataSize); ProgressBar1->Position ; if(sz=="FILE-END") //傳輸檔案的最後一個封包 { msFile->Position=0; //如果存在就刪除 mp.szFileName if(FileExists(mp.szFileName) ) DeleteFile(mp.szFileName); msFile->SaveToFile(mp.szFileName); msFile->Clear(); Image1->Picture->LoadFromFile(mp.szFileName); Label1->Caption=" 傳 輸 中 "; image_w=new Division(Image1,Image1->Picture->Height,Image1->Picture->Width); image_w->gray(); //灰階 image_w->Otsu_threshold(); //Otsu(統計式取中間值) image_w->setImage(); image_w->Horizontal_cut(); //水平分割 ProgressBar1->Max=image_w->getHorizontal_lines(); ProgressBar1->Position=0; for(k=0;kgetHorizontal_lines();k ) { image_w->setChoise_line(k 1); image_w->Catch(); image_w->Vertical_cut(); //垂直分割 image_w->cut_col_word(); //擷取一個一個的字(一行) Result=new int[image_w->getVertical_lines()]; WordSpace=new char[image_w->getVertical_lines() image_w->getSpace_lines()]; space=image_w->getSpace(); if(mp.dwkind==1) x=image_w->BP_neural_network("英文大寫"); else x=image_w->BP_neural_network("特殊符號"); for(i=0;igetcounter();i ) { Result[i]=65 x[i]; } j=0; for(i=0;igetVertical_lines();i ) { WordSpace[i j]=(char)Result[i]; if(space!=NULL) if(space[j]==i) { j ; WordSpace[i j]=(char)' '; } } WordSpace[image_w->getVertical_lines() j]='\0'; String buf(WordSpace); ServerSocket1->Socket->Connections[0]->SendText(buf); free(Result);free(WordSpace); Sleep(5); ProgressBar1->Position ; } Label1->Caption=" "; ProgressBar1->Position=0; } } } //---------------------------------------------------------------------------
 
 
發表人 - shadowjosh 於 2005/04/26 22:21:03
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-26 19:36:28 IP:210.68.xxx.xxx 未訂閱
您好: PO程式碼的方式請參考版規說明,煩請修改謝謝您的配合 < href="http://delphi.ktop.com.tw/topic.php?TOPIC_ID=58991">http://delphi.ktop.com.tw/topic.php?TOPIC_ID=58991
totony
一般會員


發表:3
回覆:20
積分:14
註冊:2004-05-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-28 14:23:03 IP:203.73.xxx.xxx 未訂閱
我猜也許是網域的問題~ 當你在區網時,由於大家在同一個網域,拿到的虛擬IP都是192.168.1.x,而且兩台電腦可以互相ping到~這時傳檔應該沒問題~ 對外連線時,外部的電腦只看得到你電腦所屬的區網對外界的真實IP,無法直接與區網內的電腦連線~ 我不知道你對NAT瞭解多少…若不太懂我這樣講可能你也不太能瞭解… 簡單說就是....在區網內你可以互相ping到對方的ip沒問題~ 但若一台在外一台在內…你試試看去ping對方就只有內對外通,外對內不通~ 不通就不能連線~不能連當然也就不能傳了~ 跨網域的傳檔就不能簡單用Client對Client的架構了~要換成Client-Server-Client的架構才行…而且Server必需兩個Client都連得到才行~ BCB我很嫩…但我不想永遠嫩下去~
Ktop_Robot
站務副站長


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

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


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


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


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

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