[問題] ftp程式 binary傳檔 資料超過...

看板C_and_CPP作者 (天地桑)時間14年前 (2010/01/10 20:58), 編輯推噓4(405)
留言9則, 4人參與, 最新討論串1/1
在linxu寫server client的ftp程式 server傳檔至client端 檔案會超過原本的file(EX:623655B -> 626688B) 抓不到錯ˊˋ... 奮戰了兩天~~仍然無解..懇請先知幫忙 server: void ftp_getfile(int sockfd,char *op2) { FILE *fp=fopen(op2,"rb"); if(!fp) { printf("cant open the file or filename error:%s\n",op2); strcpy(message.opt2,"error"); send(sockfd,&message,sizeof(message),0); ftp(sockfd);//keyword } while(!feof(fp)) { fread(&message.payload,sizeof(message.payload),1,fp); //fwrite(&message.payload,sizeof(message.payload),1,file); message.value++; send(sockfd,&message,sizeof(message),0); } strcpy(message.opt1,"ok"); printf("傳送%s\n",&message.opt1); send(sockfd,&message,sizeof(message),0); printf("All:%d time\n",message.value); fclose(fp); ftp(sockfd);//keyword } client: void ftp_getfile(FILE *fp,char *op2,int sockfd) { ssize_t n; FILE *file=fopen(op2,"wb"); for(;;){ recv(sockfd,&message,sizeof(message),0); if(strcmp(message.opt2,"error")==0) { printf("**Cant write the file or filename error:%s**\n",op2); ftp(fp,sockfd,message.value); } recv(sockfd,&message,sizeof(message),0); while(strcmp(message.opt1,"ok")!=0) { fwrite(&message.payload,sizeof(message.payload),1,file); recv(sockfd,&message,sizeof(message),0); } printf("接收File %s ok ,all %d time\n",op2,message.value); fclose(file); break; }//for(;;) message.value=0; ftp(fp,sockfd,message.value); } message.payload ->char[1024] value ->int opt1,opt2 ->char[50] 不知道client端的fwrite為什麼會多抓...懇請幫忙.. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.230.130.122

01/10 21:17, , 1F
去抓Wireshark Network Protocol Analyzer去看封包的內容吧
01/10 21:17, 1F

01/10 21:18, , 2F
我發現你的程式有一個明顯的bug
01/10 21:18, 2F

01/10 21:59, , 3F
最後一次如果 fread 沒有讀滿 buffer, 你還是寫 1024 出去
01/10 21:59, 3F

01/10 22:06, , 4F
不只最後一次 如果fread不幸沒讀滿1024 還是送了1024出去
01/10 22:06, 4F

01/10 22:07, , 5F
而且沒做封包判別tcp是streaming的 即使送對 也可能分好
01/10 22:07, 5F

01/10 22:07, , 6F
次都到 每次都到東西都寫1024進去 所以檔大小每次都不太對
01/10 22:07, 6F

01/10 22:08, , 7F
請問fwrite要怎麼得到fread所傳送的大小..??
01/10 22:08, 7F

01/10 22:09, , 8F
讀檔意外比較少啦, 都是最後一次才會少於 1024
01/10 22:09, 8F

01/10 22:14, , 9F
讀檔意外是少 但是基於莫非定律 這樣想就是衍生bug的溫床
01/10 22:14, 9F
文章代碼(AID): #1BISxqPu (C_and_CPP)