C語言檔案傳輸器

2021-10-02 11:39:55 字數 3425 閱讀 9385

根據我上篇部落格寫的兩個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...