根據我上篇部落格寫的兩個socket雛形,我總算弄出了c語言區域網檔案傳輸器。
主要涉及的問題是socket,fread/fwrite函式,還有各種各樣的意外。
上篇部落格中程式出現的問題:
檔案傳輸後後被強行填上了空白字元(若是文章則會出現大量空格)。
經過**原因是最後一次資料傳輸時大概率填不滿我們設定的緩衝區,而傳送時是整個緩衝區一起的。所以接收時會出現大量空白,導致檔案大小不一致,甚至無法開啟。
當傳送端(server)中fread函式讀到了檔案結束符(eof),便會確認檔案已經傳送完成,便可以結束程式,而接收端無法知曉檔案已經傳輸完畢,所以無法自動停止。於是我轉換了一種思路,傳送端先將檔案大小傳送給接收端,這樣接收端便可以知道什麼時候檔案傳輸完畢。但這樣有乙個缺點就是傳輸的檔案有大小限制,我使用的變數為unsigned long(大概是511mb),因為send函式傳送的緩衝區被設定為char型別陣列,將unsigned long long轉換為字串的函式並沒有找到(雖然網上大多數說strtoull與ulltostr)但是我發現自己的stdlib.h庫里沒有這玩意。更多的人使用c++ 實現的,因為我c++並未深入很多,所以還是用現有的函式吧。
#include
#include
#include
#pragma comment (lib,"ws2_32.lib")
#define buf_size 4096
//4個2^10,4kb
char send_buf[buf_size]
;int
main()
printf
("waiting for user coming.....\n");
unsigned
long lenth;
fseek
(fp,0l,
seek_end);
lenth=
ftell
(fp)
;fseek
(fp,0l,
seek_set);
//上面三個函式用於確定檔案大小
char file_lenth[
100]
;memset
(file_lenth,0,
100)
;_ultoa
(lenth,file_lenth,10)
;//將檔案大小轉換為字串,準備傳送
wsadata wsa;
wsastartup
(makeword(2
,2),
&wsa)
; socket serve =
socket
(pf_inet, sock_stream, ipproto_tcp)
; sockaddr_in saddr;
memset
(&saddr,0,
sizeof
(sockaddr));
saddr.sin_family = af_inet;
saddr.sin_addr.s_un.s_addr =
htonl
(inaddr_any)
; saddr.sin_port =
htons
(4444);
bind
(serve,
(sockaddr *
)&saddr,
sizeof
(sockaddr));
listen
(serve,5)
;int nsize =
sizeof
(sockaddr)
; socket client =
accept
(serve,
(sockaddr*
)&saddr,
&nsize);if
(client !=-1
)printf
("user come in!\n");
send
(client,file_name,50,
0);send
(client,file_lenth,
100,0)
;//將檔名與大小傳輸給接收端
while
(lenth>0)
//當檔案大小大於0
else
memset
(send_buf,
0,buf_size);}
shutdown
(client,sd_send)
;//向接收端傳送fin包,按理說我這方法
fclose
(fp)
;//不用這一句也行,穩妥起見。
closesocket
(client)
;closesocket
(serve)
;wsacleanup()
;printf
("complished!");
system
("pause");
return0;
}
#include
#include
#include
#pragma comment (lib,"ws2_32.lib")
#define buf_size 4096
char recv_buf[buf_size]
;char ip_addr[16]
;int
main()
;unsigned
long lenth;
char
*temp;
//strtoul函式需要,按理說不用也行,函式中第二個引數似乎可以留空
recv
(client,file_name,50,
0);recv
(client,file_lenth,
100,0)
; lenth=
strtoul
(file_lenth,
&temp,10)
;//將檔案大小從字串轉化回unsigned long型別
fp=fopen
(file_name,
"wb");
//建立同名檔案
while
(lenth>0)
else
memset
(recv_buf,
0,buf_size);}
fclose
(fp)
;closesocket
(client)
;wsacleanup()
;printf
("complished!");
system
("pause");
return0;
}
如果還有精力的話我會找一些方法來增大可傳輸檔案大小。
對於乙個弱雞來說這個程式已經差不多吧我榨乾了…
檔案傳輸設計C
檔案傳輸 tcp協議 傳輸所有型別的檔案 步驟 先搭建網路傳輸通道 windows socket 網路傳輸協議 tcp協議。分為接收端 伺服器 和傳送端 客戶端 可以有多個服務端也就是有多個接收端。相關函式 wsastartup 請求版本,含有兩個引數,第乙個是請求的版本號 例如windows 第二...
伺服器檔案傳輸
scp r 在本地向伺服器傳輸檔案 從本地上傳檔案到伺服器,終端命令應執行在本機上 scp 本地檔案的路徑 伺服器使用者名稱 伺服器位址 伺服器上存放檔案的路徑 scp scp1.png root 119.23.75.150 home admin scp r 本地資料夾的路徑 伺服器使用者名稱 伺服...
Just網路傳輸器和JSONExport的使用
首先使用cocoapod來配置just 首先建立乙個空的檔案podfile 在podflie中新增一句話 use frameworks pod just 用open with external editor用終端來開啟 轉換到根目錄下 用cd.再ls退到根目錄,隨後再輸入命令來安裝just json...