發信人infboy.bbs@bbs.sayya.org (珍惜, 享受每一天),
看板Programming
標 題Re: [問題] socket linux c 傳送檔案有時會錯誤
發信站SayYA 資訊站 (Sun Jan 11 23:30:02 2009)
轉信站ptt!news.ntu!news.ncu!News.Math.NCTU!SayYa
※ 引述《HILL33LOVE.bbs@ptt.cc (就是愛希爾)》之銘言:
> 目前在練習寫linux c socket的練習
> 在程式中用一個while迴圈來接收Client端送來要求多個檔名的功能
> 在檔案大小都很小的時候,都很正常接收,但如果檔案大小很大>>BUF_SIZE(1024)時
> 就會發生傳輸有問題,常常Client端接收到的檔案大小有問題
> 可是我在傳檔案內容有另一個while迴圈去讀要開啟的檔案的大小
> 再去送到socket
> 傳輸檔案流程:
> server先接收到檔名,開檔去把檔案大小傳給client,接著server就把檔案內容傳給
> cleint。
> 會不會是server連續傳兩次,會造成有這種問題,還是要改成client傳給server一個訊息
> 之後,server再傳給client,盡量避免某一方連續傳兩次的情況出現,
> 想提出來看有沒有再傳檔案的時候也有同樣的問題,
> 還有大家再寫socket的時候,在read之前都會習慣把buffer清空嗎?
> 因為之前常遇到buffer沒有清空而造成程式有問題。謝謝
> while(1){
> memset(buffer,0,sizeof(buffer));
> ret=read(connfd,buffer,BUF_SIZE); //接收檔名
> if(ret==0){
> printf("Client Over\n");
> break;
> }
> if((file_fd=open(buffer,O_RDONLY))==-1){
> Error("can't open file");
> }
> filesize=doGetFileSize(buffer,"r"); //得知檔案大小的函數
> filesizestr[0]= filesize;
> sprintf(buf,"%d",filesizestr[0]);
> write(connfd,buf,BUF_SIZE); //傳檔案大小
可以送出 buf 資料長度就好
> memset(buffer,0,sizeof(buffer));
> while((ret=read(file_fd,buffer,BUF_SIZE))>0){ //傳檔案內容
> write(connfd,buffer,ret);
> }
應該要檢查 write 多少資料出去,
沒送出去的要補送.
> close(file_fd);
> }
> break;
(PTT 大概也看不到這篇回應)
--
幸福,當我滿頭白髮時,依然能夠與妳手牽著手攸然散步。
--
※ Origin: SayYA 資訊站 <bbs.sayya.org>
◆ From: 140.116.216.159
推 HILL33LOVE:我把write(connfd,buf,strlen(buf));之 220.136.96.50 01/12 22:25
→ HILL33LOVE:後,就沒有問題了,我想問一下,在read 220.136.96.50 01/12 22:26
→ HILL33LOVE:和write這兩個,我如果要讀read(x,y,Bu 220.136.96.50 01/12 22:27
→ HILL33LOVE:uffer_size),但是在寫進socket如果用 220.136.96.50 01/12 22:28
→ HILL33LOVE:write(x,buffer,Buffer_size)的話,假 220.136.96.50 01/12 22:29
→ HILL33LOVE:假設buffer裡面的內容沒有到buff_size 220.136.96.50 01/12 22:30
→ HILL33LOVE:是不是就變成多的空白部分他也會寫到 220.136.96.50 01/12 22:30
→ HILL33LOVE:socket裡面造成傳輸過程會有錯誤的原因 220.136.96.50 01/12 22:31
→ HILL33LOVE:呢?? 謝謝 220.136.96.50 01/12 22:32
→ Lordaeron:你測一下不就清楚了, 幹嘛要問呢125.232.133.117 01/13 13:36