Re: [問題] socket linux c 傳送檔案有時會錯誤
※ 引述《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
01/12 22:25, 1F
→
01/12 22:26, , 2F
01/12 22:26, 2F
→
01/12 22:27, , 3F
01/12 22:27, 3F
→
01/12 22:28, , 4F
01/12 22:28, 4F
→
01/12 22:29, , 5F
01/12 22:29, 5F
→
01/12 22:30, , 6F
01/12 22:30, 6F
→
01/12 22:30, , 7F
01/12 22:30, 7F
→
01/12 22:31, , 8F
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
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):