ftp客戶端上傳功能代碼設計
ftp客戶端 下載功能,用一個recv就可以接受所有的數據了。可上傳的時候,如果僅用send函數來實現,目標文件的大小比原文件要小。懷疑是上傳過程中需要傳輸控制,誰能解釋一下原因並大概給個思路,謝謝。
《解決方案》
原帖由 user2003 於 2007-9-13 16:24 發表 http://bbs.chinaunix.net/images/common/back.gif
ftp客戶端 下載功能,用一個recv就可以接受所有的數據了。可上傳的時候,如果僅用send函數來實現,目標文件的大小比原文件要小。懷疑是上傳過程中需要傳輸控制,誰能解釋一下原因並大概給個思路,謝謝。
FTP協議沒有特別的控制, 上傳結束只是用簡單的關閉數據Socket的方式告訴對端的.
《解決方案》
我累計了每次send函數的返回值,發現其與源文件的大小是一致的,可為何伺服器(接受端)生成的文件大小卻小於源文件呢?
《解決方案》
ftp客戶端 下載功能,用一個recv就可以接受所有的數據了。可上傳的時候,如果僅用send函數來實現,目標文件的大小比原文件要小。
==================================上傳 部分的代碼: ==================================
void process_sendfile(int rd_sockfd)
{
int n=1;
int line =1;
FILE *fup;
fup=fopen("333.exe", "rb");
while (n!=0)
{
n=fread(filebuf, 1, FILEBUF_LEN, fup);
n=send(rd_sockfd, filebuf, n, 0);
printf("line %d, n is %d\r\n",line++,n);
}
close(rd_sockfd);
}
==================================從ftp server上看的上傳記錄==================================
Fri 14Sep07 11:44:35 - (000005) Connected to 10.10.60.99 (Local address 10.10.60.99)
Fri 14Sep07 11:44:35 - (000005) User ABC logged in
Fri 14Sep07 11:44:35 - (000005) Receiving file d:\ftp\new.exe
Fri 14Sep07 11:44:36 - (000005) Error receiving file d:\ftp\new.exe, aborting (2240 kB/sec - 458752 Bytes, command connection closed)
Fri 14Sep07 11:44:36 - (0000
Yang Yang 說:
紅色部分出現了異常,文件總大小因該市488752左右,不知為何abort了
===============================抓包記錄==================================
---------------------FTPC出問題時的抓包記錄---------------------
No. Time Source Destination Protocol Info
575 0.085038 10.10.60.99 10.10.60.56 FTP-DATA FTP Data: 688 bytes
576 0.085088 10.10.60.56 10.10.60.99 TCP 3268 > 3644 Seq=1 Ack=479517 Win=49151 Len=0
577 0.085310 10.10.60.56 10.10.60.99 TCP 3268 > 3644 Seq=1 Ack=482437 Win=46231 Len=0
578 0.085518 10.10.60.56 10.10.60.99 TCP 3268 > 3644 Seq=1 Ack=484789 Win=43879 Len=0
579 0.085761 10.10.60.56 10.10.60.99 TCP 3268 > 3644 Seq=1 Ack=487709 Win=40959 Len=0
580 0.088016 10.10.60.56 10.10.60.99 TCP 3268 > 3644 Seq=1 Ack=488397 Win=65535 Len=0
581 0.129264 10.10.60.99 10.10.60.56 TCP 3644 > 3268 Seq=488397 Ack=1 Win=0 Len=0
582 0.129340 10.10.60.99 10.10.60.56 TCP 3643 > ftp Seq=70 Ack=276 Win=0 Len=0
583 1.504890 10.10.60.56 10.10.60.99 NBNS Name query NBSTAT *<00><00><00><00><00><00><00><00><00><00><00><00><00><00><00>
584 1.504997 10.10.60.99 10.10.60.56 NBNS Name query response NBSTAT
---------------------FlashFXP正常上傳抓包記錄---------------------
No. Time Source Destination Protocol Info
3244 0.426788 10.10.60.99 10.10.60.56 FTP-DATA FTP Data: 1176 bytes
3245 0.426951 10.10.60.99 10.10.60.56 TCP 1980 > 2076 Seq=2727937 Ack=1 Win=65535 Len=0
3246 0.427074 10.10.60.56 10.10.60.99 TCP 2076 > 1980 Seq=1 Ack=2722665 Win=65535 Len=0
3247 0.427215 10.10.60.56 10.10.60.99 TCP 2076 > 1980 Seq=1 Ack=2723841 Win=64359 Len=0
3248 0.427419 10.10.60.56 10.10.60.99 TCP 2076 > 1980 Seq=1 Ack=2726761 Win=65535 Len=0
3249 0.427475 10.10.60.56 10.10.60.99 TCP 2076 > 1980 Seq=1 Ack=2727937 Win=64359 Len=0
3250 0.427705 10.10.60.56 10.10.60.99 TCP 2076 > 1980 Seq=1 Ack=2727938 Win=64359 Len=0
3251 0.428936 10.10.60.56 10.10.60.99 TCP 2076 > 1980 Seq=1 Ack=2727938 Win=64359 Len=0
3252 0.428964 10.10.60.99 10.10.60.56 TCP 1980 > 2076 Seq=2727938 Ack=2 Win=65535 Len=0
3253 0.454703 10.10.60.56 10.10.60.99 FTP Response: 226 Transfer complete.
[ 本帖最後由 user2003 於 2007-9-14 13:57 編輯 ]
《解決方案》
你的客戶端關閉連接發的是RST, 這是reset,當然伺服器abort了. Flashfxp發的是FIN,正常關閉. 關閉socket連接最好先shutdown(), 然後在close()