當前位置:編程學習大全網 - 編程語言 - C語言安全文件傳輸程序設計。

C語言安全文件傳輸程序設計。

安全文件傳輸程序?就是TCP傳輸吧:隨便寫了下,好多地方都沒怎麽驗證,比如待發送的文件是否存在;代碼如下(此程序用於WINDOWS,我用的是VC調試的,LINUX下方法略有不同)文件接收端:#pragma comment(lib,"ws2_32.lib")#include <stdio.h>

#include <io.h>

#include <winsock2.h>

#include <fcntl.h>

#include <sys\stat.h>

int recv_file(SOCKET sock)

{

char buffer[1024] = {0};

int name_len;

/*首先讀取sizeof(int) 即4個字節的內容,服務器發送文件名之前會把該文件名的長度發送過來*/

if (recv(sock,(char *)&name_len,sizeof(int),0) < 0)

{

printf("遠程服務器斷開");

return -1;

}

/*接收即將傳輸文件的文件名*/

if (recv(sock,buffer,name_len,0))

{

printf("遠程服務器斷開");

return -1;

}

/*創建該文件,最好此處加上判斷,該文件是否已經存在*/

int fd = open(buffer,O_RDWR|O_CREAT ,S_IFMT );

if (fd < 0)

{

printf("文件創建失敗\n");

return -1;

}

int recv_count = 0;

/*從套接字循環讀取文件內容*/

while ((recv_count = recv(sock,buffer,sizeof(1024),0))>0)

{

/*將讀取到的內容保存至文件,recv_count為從網絡上讀取到得字節數,然後原數保存至文件*/

write(fd,buffer,recv_count);

}

printf("文件接收完成,成功保存至當前目錄下\n");

return 0;

}

void main()

{

WSADATA wsa_data;

/*windows 下使用sock 必須調用這個函數,0x0202是壹個版本號*/

WSAStartup(0x0202,&wsa_data); SOCKET s_sock;

/*創建套接字*/

s_sock = socket(AF_INET,SOCK_STREAM,0); /*定義本機綁定套接字需要的IPV4地址*/

sockaddr_in se_addr;

se_addr.sin_family = AF_INET;

se_addr.sin_port = htons(1024);/*指定端口號1024*/

se_addr.sin_addr.S_un.S_addr = INADDR_ANY;/*綁定本機任意網卡IP*/ /*將前兩步創建的套接字和IP地址綁定*/

bind(s_sock,(sockaddr*)&se_addr,sizeof(sockaddr)); /*開始啟動監聽服務*/

if (listen(s_sock,10)<0)

{

int err = GetLastError();

}

sockaddr_in from_addr;

int addr_len = sizeof(from_addr);

/*等待發送文件服務器連接,此為阻塞函數*/

SOCKET temp_sock = accept(s_sock,(sockaddr *)&from_addr,&addr_len); /*有服務器連接到本機,調用接收文件函數*/

recv_file(temp_sock);

} 文件發送端:#pragma comment(lib,"ws2_32.lib")#include <stdio.h>

#include <io.h>

#include <winsock2.h>

#include <fcntl.h>

#include <sys\stat.h>

int send_file(SOCKET sock,char *name)

{

int fd = open(name,O_RDWR ,S_IFMT );

if (fd < 0)

{

printf("文件打開失敗\n");

return -1;

} int name_len = strlen(name);

/*首先發送文件名的長度*/

send(sock,(char *)&name_len,sizeof(int),0);

/*發送文件名*/

send(sock,name,name_len,0);

char buffer[1024] = {0};

int read_count = 0;

/*循環從文件中讀取,然後寫入到套接字,發送到網絡*/

while ((read_count = read(fd,buffer,sizeof(1024)))>0)

{

send(sock,buffer,read_count,0);

}

printf("文件發送完成\n");

return 0;

}

void main(int argc,char *argv[])

{

WSADATA wsa_data;

WSAStartup(0x0202,&wsa_data);

SOCKET s_sock;

s_sock = socket(AF_INET,SOCK_STREAM,0);

sockaddr_in to_addr;

to_addr.sin_family = AF_INET;

to_addr.sin_port = htons(1024);

/*指定接收文件IP為本機(127.0.0.1為本機IP),如其他主機請更改此IP,正常來說,IP應寫入配置文件*/

to_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

char file_name[256] = {0};

printf("請輸入要發送的文件名,並確保該文件存在於當前目錄下\n");

scanf("%s",file_name); /*連接接收文件的電腦*/

if (connect(s_sock,(sockaddr *)&to_addr,sizeof(sockaddr)) < 0)

{

printf("鏈接接受文件電腦失敗\n");

return;

} /*調用發送文件函數*/

send_file(s_sock,file_name);

}

  • 上一篇:erc20和trc20的區別
  • 下一篇:給工藤新壹吃藥的叫什麽?
  • copyright 2024編程學習大全網