简单文件传输

来源:互联网 发布:软件模拟陀螺仪 编辑:程序博客网 时间:2024/04/19 09:08
 

-----原理:
文件传输的原理其实很简单,服务端先在某个端口监听,等待客户端的连接,连接成功后,服务端打开指定的文件,然后读取文件,再通过创建的套接字发送给客户端。如果要实现一个服务端能与多个客户端连接,则需要用到多线程,下面给出一对一的实现代码,有兴趣的朋友可以用多线程实现一对多。

-----程序代码:

[cpp] view plaincopyprint?
  1. //fileserver.cc  
  2. #include <iostream>  
  3. #include <stdio.h>  
  4. #include <strings.h>  
  5. #include <stdlib.h>  
  6. #include <sys/types.h>  
  7. #include <sys/socket.h>  
  8. #include <arpa/inet.h>  
  9. #include <netinet/in.h>  
  10. using namespace std;  
  11.   
  12. //./fileserver 2000 hahaya.txt 其中2000为端口号,hahaya.txt为文件名  
  13. int main(int argc, char *argv[])  
  14. {  
  15.     int sk = socket(AF_INET, SOCK_STREAM, 0);  
  16.     if(sk == -1)  
  17.     {  
  18.     cout << "create socket failed..." << endl;  
  19.     return 0;  
  20.     }  
  21.   
  22.     struct sockaddr_in serveraddr;  
  23.     bzero(&serveraddr, sizeof(serveraddr));  
  24.     serveraddr.sin_family = AF_INET;  
  25.     serveraddr.sin_port = htons(atoi(argv[1]));  
  26.     serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);  
  27.     if(bind(sk, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) != 0)  
  28.     {  
  29.     cout << "bind failed..." << endl;  
  30.     close(sk);  
  31.     return 0;  
  32.     }  
  33.   
  34.     listen(sk, 5);  
  35.   
  36.     struct sockaddr_in clientaddr;  
  37.     bzero(&clientaddr, sizeof(clientaddr));  
  38.     size_t len = sizeof(clientaddr);  
  39.   
  40.     int talk = accept(sk, (struct sockaddr*)&clientaddr, &len);  
  41.   
  42.     //打开文件并准备发送  
  43.     cout << "server ready..." << endl;  
  44.   
  45.     FILE *fp = fopen(argv[2], "r+");  
  46.     int size = 0;  
  47.     char buff[1024] = {'\0'};  
  48.     while((size = fread(buff, 1, sizeof(buff), fp)) > 0)  
  49.     {  
  50.     cout << "file sending..." << endl;  
  51.     send(talk, buff, size, 0);  
  52.     }  
  53.   
  54.   
  55.     cout << "send success..." << endl;  
  56.     fclose(fp);  
  57.     close(talk);  
  58.     close(sk);  
  59.     return 0;  
  60. }  
  61.   
  62. //fileclient.cc  
  63. #include <iostream>  
  64. #include <stdio.h>  
  65. #include <stdlib.h>  
  66. #include <strings.h>  
  67. #include <sys/types.h>  
  68. #include <sys/socket.h>  
  69. #include <arpa/inet.h>  
  70. #include <netinet/in.h>  
  71. using namespace std;  
  72.   
  73. //./clientserver 192.168.0.1 2000 hahaya.txt  
  74. int main(int argc, char *argv[])  
  75. {  
  76.     int sk = socket(AF_INET, SOCK_STREAM, 0);  
  77.     if(sk == -1)  
  78.     {  
  79.     cout << "create socket failed..." << endl;  
  80.     return 0;  
  81.     }  
  82.   
  83.     struct sockaddr_in serveraddr;  
  84.     bzero(&serveraddr, sizeof(serveraddr));  
  85.     serveraddr.sin_family = AF_INET;  
  86.     serveraddr.sin_port = htons(atoi(argv[2]));  
  87.     serveraddr.sin_addr.s_addr = inet_addr(argv[1]);  
  88.   
  89.     connect(sk, (struct sockaddr*)&serveraddr, sizeof(serveraddr));  
  90.   
  91.     FILE *fp = fopen(argv[3], "w+");  
  92.     char buff[1024] = {'\0'};  
  93.     int len = 0;  
  94.     cout << "begin recv..." << endl;  
  95.     while((len = recv(sk, buff, sizeof(buff), 0)) > 0)  
  96.     {  
  97.     cout << "file recv..." << endl;  
  98.     fwrite(buff, 1, len, fp);  
  99.     }  
  100.   
  101.     cout << "file success..." << endl;  
  102.     close(sk);  
  103.     fclose(fp);  
  104.     return 0;  
  105. }  

-----程序运行:
开启服务端: ./fileserver 2000 ./eclipse.zip
开启客户端: ./fileclient 192.168.254.128 2000 ./test.zip

这样就把eclipse.zip传到客户端了