守望先锋有几个阵营:C语言安全文件传输程序设计。

来源:百度文库 编辑:中财网 时间:2024/07/08 19:18:15

安全文件传输程序?就是TCP传输吧:随便写了下,好多地方都没怎么验证,比如待发送的文件是否存在;代码如下(此程序用于WINDOWS,我用的是VC调试的,LINUX下方法略有不同)

文件接收端:

#pragma comment(lib,"ws2_32.lib")

#include
#include
#include
#include
#include


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
#include
#include
#include
#include


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);
}

 

 

回答人的补充   2010-08-21 08:16

记得运行时,要首先运行文件接收端,如果先运行文件发送端,此时文件接收端还没有启动监听,发送端将会直接返回连接失败。

提问人的追问   2010-08-22 10:41

问下,为什么他会说找不到文件呢?我就是把文件放在当前文件下啊。...

回答人的补充   2010-08-22 10:49

是运行程序的时候,提示 “打开文件失败” 吗? 你是用什么方式调试的? 如果你是直接运行生成的.EXE文件,那么当前目录就是和.exe同目录,如果你是调试运行,当前目录就是和这个程序的源文件所在目录或者与该工程同目录,记得输入的时候是文件的全名,包括扩展名。

提问人的追问   2010-08-22 11:00

额.可以的。我没加后缀.

大哥,.可以再帮我个忙吗?要求改成可以上传下载的程序...跪谢了.

我还有30多分,全给你了。

回答人的补充   2010-08-22 11:33

文件传输容易,可是如果你想下载的话,就要有个界面来显示服务器上有哪些文件,要用什么做界面?而且服务器和客户端之间要有一定的协议,比如客户端有可能会发请求查看某个目录下有哪些文件,有可能发更改目录,这将不是一会能够完成的事了,以前linux下做个一个FTP协议的文件传输,不过也仅仅是负责写服务器而已。

提问人的追问   2010-08-22 16:18

能麻烦你帮我写下吗?跪谢了。

回答人的补充   2010-08-24 08:15

真的不好意思,最近太忙了。。。