Re: [問題] socket linux c 傳送檔案有時會錯誤

看板Programming作者時間17年前 (2009/01/12 02:01), 編輯推噓1(109)
留言10則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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

01/12 22:25, , 1F
我把write(connfd,buf,strlen(buf));之
01/12 22:25, 1F

01/12 22:26, , 2F
後,就沒有問題了,我想問一下,在read
01/12 22:26, 2F

01/12 22:27, , 3F
和write這兩個,我如果要讀read(x,y,Bu
01/12 22:27, 3F

01/12 22:28, , 4F
uffer_size),但是在寫進socket如果用
01/12 22:28, 4F

01/12 22:29, , 5F
write(x,buffer,Buffer_size)的話,假
01/12 22:29, 5F

01/12 22:30, , 6F
假設buffer裡面的內容沒有到buff_size
01/12 22:30, 6F

01/12 22:30, , 7F
是不是就變成多的空白部分他也會寫到
01/12 22:30, 7F

01/12 22:31, , 8F
socket裡面造成傳輸過程會有錯誤的原因
01/12 22:31, 8F

01/12 22:32, , 9F
呢?? 謝謝
01/12 22:32, 9F

01/13 13:36, , 10F
你測一下不就清楚了, 幹嘛要問呢
01/13 13:36, 10F
文章代碼(AID): #19QZFV00 (Programming)
文章代碼(AID): #19QZFV00 (Programming)