用serversocket傳檔的問題 |
答題得分者是:andychang1690
|
haman
中階會員 發表:46 回覆:137 積分:56 註冊:2005-03-10 發送簡訊給我 |
我在本機上寫了一個"檔案拷貝"功能的軟体,測過,ok(用fopen)
這陣子要寫一個以serversocket傳送檔案的軟体,也是用fopen,方式一樣,
但是問題來了,只能傳送純文字檔,不能傳送word檔(變亂碼,而且資料量少很多),mp3更慘,傳兩三次(封包次數)後就停了,這是什麼原因呢?
以下是"檔案拷貝"主要的部份.
void __fastcall TForm1::Button2Click(TObject *Sender)
{
String test;
char *s = StrNew(FilePath.c_str());
SaveDialog1->Execute();
test =ExtractFilePath(SaveDialog1->FileName);
test = test + ExtractFileName(SaveDialog1->FileName);
Edit2->Text = test;
char *ch=StrNew(test.c_str()),line;
FILE *FileTest = fopen(ch,"ab");
FILE *FileTestS = fopen(s,"rb"); while(!feof(FileTestS))
{
line = getc(FileTestS);
putc(line,FileTest);
}
fclose(FileTestS);
fclose(FileTest);
}
以下是改成網路傳送的主要部份
void TForm1::ClientReceiveText(String Received)
{
static FILE *FileTest;
static int x = 0;
Memo1->Lines->Add(Received);
if(!First)
{
SaveDialog1->FileName = Received;
SaveDialog1->Execute();
FilePath =ExtractFilePath(SaveDialog1->FileName) + Received;
char *ch=StrNew(FilePath.c_str());
FILE *File = fopen(ch,"a");
FileTest = File;
First = true;
}
else
{
int i;
char line[50]; if(Received != "Finish")
{
strcpy(line,Received.c_str());
for(i = 0;i
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
haman:改用SendBuf()吧! #define _BUFFERSIZE 8192 if (FileExists(FilePath)) { char* Buffer = new char[_BUFFERSIZE 1]; //開啟檔案 int FileHandle = FileOpen(FilePath, fmOpenRead); do { int rBytes = FileRead(FileHandle, Buffer, _BUFFERSIZE); if ((rBytes > 0) && ServerSocket1->Socket->Connections[0]->Connected) ServerSocket1->Socket->Connections[0]->SendBuf(Buffer, rBytes); else break; } while (true); delete[] Buffer; FileClose(FileHandle); }Andy Chang
------
Andy Chang |
haman
中階會員 發表:46 回覆:137 積分:56 註冊:2005-03-10 發送簡訊給我 |
哦哦..原來程式碼可以這樣po哦,感謝taishyang大大
下面是"檔案拷貝"的主要片段
void __fastcall TForm1::Button2Click(TObject *Sender) { String test; char *s = StrNew(FilePath.c_str()); SaveDialog1->Execute(); test =ExtractFilePath(SaveDialog1->FileName); test = test ExtractFileName(SaveDialog1->FileName); Edit2->Text = test; char *ch=StrNew(test.c_str()),line; FILE *FileTest = fopen(ch,"ab"); FILE *FileTestS = fopen(s,"rb"); while(!feof(FileTestS)) { line = getc(FileTestS); putc(line,FileTest); } fclose(FileTestS); fclose(FileTest); }下面這個是改成網路的 void __fastcall TForm1::ServerSocket1ClientError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) { Memo1->Lines->Add("連線發生錯誤"); } //--------------------------------------------------------------------------- void TForm1::ClientReceiveText(String Received) { static FILE *FileTest; static int x = 0; Memo1->Lines->Add(Received); if(!First) { SaveDialog1->FileName = Received; SaveDialog1->Execute(); FilePath =ExtractFilePath(SaveDialog1->FileName) Received; char *ch=StrNew(FilePath.c_str()); FILE *File = fopen(ch,"a"); FileTest = File; First = true; } else { int i; char line[50]; if(Received != "Finish") { strcpy(line,Received.c_str()); for(i = 0;i |
haman
中階會員 發表:46 回覆:137 積分:56 註冊:2005-03-10 發送簡訊給我 |
呵呵,感謝Andy大大的幫忙,這個問題大部份已經解決了,只剩下一點怪怪的小問題,如果我解決不了再上來麻煩Andy大大吧^^" 現在就把我修改過的副程式po上來吧^^
void TForm1::ClientReceiveText(char* Received) { static FILE *FileTest; static int x = 0,FileSize; // Memo1->Lines->Add(Received); if(!First) { String ReceiveTmp = Received; SaveDialog1->FileName = ReceiveTmp.SubString(1,ReceiveTmp.Pos(":")-1); String test = ReceiveTmp.SubString(ReceiveTmp.Pos(":") 1,ReceiveTmp.Length()); // test = test.SubString(1,test.Pos("u")-1); FileSize = StrToInt(test); Memo1->Lines->Add("File size is :" IntToStr(FileSize)); SaveDialog1->Execute(); FilePath =ExtractFilePath(SaveDialog1->FileName) ReceiveTmp.SubString(1,ReceiveTmp.Pos(":")-1); char *ch=StrNew(FilePath.c_str()); FILE *File = fopen(ch,"ab"); FileTest = File; First = true; } else { int i; if(strcmp(Received,"Finish")) { for(i = 0;i<_BUFFERSIZE;i ) putc(*(Received i),FileTest); } else { fclose(FileTest); ClientSocket1->Close(); Memo1->Lines->Add("接收完成"); } } ClientSocket1->Socket->SendText(IntToStr( x)); } //---------------------------------------------------------------------------- void TForm1::ServerReceiveText(String Received) { static bool SendFinish = false,FileOpened = false,FileClosed = false; static int x = 0; Memo1->Lines->Add(IntToStr( x)); char* Buffer = new char[_BUFFERSIZE]; static FILE *FileTest; if(FileOpened == false) { char *ch = StrNew(FilePath.c_str()); FILE *File = fopen(ch,"rb"); FileTest = File; FileOpened = true; int i; for(i = 0;i<_BUFFERSIZE;i ) { if(feof(FileTest)) { SendFinish = true; break; } *(Buffer i) = getc(FileTest); } ServerSocket1->Socket->Connections[0]->SendBuf(Buffer,_BUFFERSIZE); } else { int i; if(SendFinish == true) { FileClosed = true; fclose(FileTest); ServerSocket1->Socket->Connections[0]->SendText("Finish"); ServerSocket1->Close(); } else { for(i = 0;i<_BUFFERSIZE;i ) { if(feof(FileTest)) { SendFinish = true; break; } *(Buffer i) = getc(FileTest); } ServerSocket1->Socket->Connections[0]->SendBuf(Buffer,_BUFFERSIZE); } } } |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |