C语言安全文件传输程序设计。

Python015

C语言安全文件传输程序设计。,第1张

安全文件传输程序?就是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)

}

//自己写的加密,加密方法就是根据输入的密码对文件中的内容进行异或后存放在加密后的文件中

//转载请声明program by STU caige

#include<stdio.h>

#include<stdlib.h>

#include <conio.h>//getche()需要

#include<string.h>

char ch

//异或函数

int YiHuo(FILE *f0,FILE *fp,int passwordnum,int move,char key)

{

while(fread(&ch,1,1,f0),!feof(f0))

{

if (key==49)//加密

{

ch=ch+move

(char)(ch^=passwordnum)

fwrite(&ch,1,1,fp)

}

if (key==50)//解密

{

(char)(ch^=passwordnum)

ch=ch+move

fwrite(&ch,1,1,fp)

}

}

}

int main()

{

//encrypt加密 decrypt解密

FILE *f0,*fe,*fd

char fname0[50]

char efname[50]={0}

char dfname[50]={0}

char Password[50]={0},key=0,key2=0

char sysfname[20]={0}

int p=0,passwordnum,move=0//异或后移动的次数

system("cls")

do

{

system("cls")

do

{

printf("1-----------加密文件\n")

printf("2-----------解密文件\n")

printf("Esc----------退出\n")

key=getch()//读入一个键盘码

}

while ((key!='1')&&(key!='2')&&(key!=27))

Password[50]=0

passwordnum=0

if (key==49)

{

system("cls")

printf("请输入要加密的文件绝对路径\n")

scanf("%s",fname0)

// while(key=0)

//打开原文件

if ((f0=fopen(fname0,"rb"))==NULL)

{

printf("文件打不开哦!\n")

key=0//文件打开失败时key的值改变

exit(0)

printf("加密失败\n")

system("pause")

}

//只有文件fname0打开成功时才能继续打开efname

if(key==49)

{

system("cls")

printf("请输入完成加密的文件存储路径\n")

scanf("%s",efname)

if ((fe=fopen(efname,"w+"))==NULL)

{

printf("文件打不开哦!\n")

printf("加密失败\n")

fclose(f0)

system("pause")

exit(0)

key=0

}

}

//如果打开文件成功则开始输入密码

if(key==49)

{

system("cls")

printf("请输入密码\n")

scanf("%s",Password)

//把字符密码转化为整形来异或

for(p=0Password[p]!=0p++)

passwordnum+=((int)Password[p])

move=(int)(passwordnum%9)

while (move>9)

move=(int)(move%9)

printf("%d",move)system("pause")

}

if (key==49)

{//异或加密

system("cls")

YiHuo(f0,fe,passwordnum,move,key)

printf("\n加密成功,您的输出文件路径为:\n")

printf("%s",efname)

fclose(f0)

fclose(fe)

}

}

if (key==50)

{

system("cls")

printf("请输入要解密的文件绝对路径\n")

scanf("%s",fname0)

// while(key=0)

//打开原文件

if ((f0=fopen(fname0,"rb"))==NULL)

{

printf("文件打不开哦!\n")

key=0//文件打开失败时key的值改变

exit(0)

printf("解密失败\n")

system("pause")

}

//只有文件fname0打开成功时才能继续打开dfname

if(key==50)

{

system("cls")

printf("请输入完成解密的文件存储路径\n")

scanf("%s",dfname)

if ((fd=fopen(dfname,"w+"))==NULL)

{

printf("解密失败")

fclose(f0)

system("pause")

printf("文件打不开哦!\n")

exit(0)

key=0

}

}

//如果打开文件成功则开始输入密码

if(key==50)

{

system("cls")

printf("请输入密码\n")

scanf("%s",Password)

//把字符密码转化为整形来异或

for(p=0Password[p]!=0p++)

passwordnum+=((int)Password[p])

move=(int)(passwordnum%9)

while (move>9)

move=(int)(move%9)

move=(-move)

}

if (key==50)

{//异或加密

system("cls")

YiHuo(f0,fd,passwordnum,move,key)

printf("\n解密成功,您的输出文件路径为:\n%S",dfname)

system("pause")

fclose(f0)

fclose(fd)

}

}

}

while(key!=27)//当key为0,即读写两个文件都打开成功时才结束循环

return 0

printf("\n谢谢使用!,program by STU caige\n")

system("pause")

}