免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8016 | 回复: 5
打印 上一主题 下一主题

Linux下的socket文件传输 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-27 14:30 |只看该作者 |倒序浏览
[代码] server.c
view sourceprint?001 ////////////////////////////////////  

002 //服务器代码  

003 ///////////////////////////////////  

004 //本文件是服务器的代码  

005 #include <netinet/in.h>    // for sockaddr_in  

006 #include <sys/types.h>    // for socket  

007   

008 #include <sys/socket.h>    // for socket  

009 #include <stdio.h>        // for printf  

010 #include <stdlib.h>        // for exit  

011 #include <string.h>        // for bzero  

012 #include <time.h>                //for time_t and time  

013   

014   

015 #define HELLO_WORLD_SERVER_PORT 7754  

016 #define LENGTH_OF_LISTEN_QUEUE 20  

017 #define BUFFER_SIZE 1024  

018   

019   

020 int main(int argc, char **argv)  

021 {  

022 //设置一个socket地址结构server_addr,代表服务器internet地址, 端口  

023 struct sockaddr_in server_addr;  

024 bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0  

025 server_addr.sin_family = AF_INET;  

026 server_addr.sin_addr.s_addr = htons(INADDR_ANY);  

027 server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);  

028 // time_t now;  

029 FILE *stream;  

030   

031   

032 //创建用于internet的流协议(TCP)socket,用server_socket代表服务器socket  

033 int server_socket = socket(AF_INET,SOCK_STREAM,0);  

034 if( server_socket < 0)  

035 {  

036 printf("Create Socket Failed!");  

037 exit(1);  

038 }  

039   

040 //把socket和socket地址结构联系起来  

041 if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))  

042 {  

043 printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);  

044 exit(1);  

045 }  

046   

047 //server_socket用于监听  

048 if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) )  

049 {  

050 printf("Server Listen Failed!");  

051 exit(1);  

052 }  

053   

054 while (1) //服务器端要一直运行  

055 {  

056   

057 struct sockaddr_in client_addr;  

058 socklen_t length = sizeof(client_addr);  

059   

060 int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);  

061 if ( new_server_socket < 0)  

062 {  

063 printf("Server Accept Failed!\n");  

064 break;  

065 }  

066   

067 char buffer[BUFFER_SIZE];  

068 bzero(buffer, BUFFER_SIZE);  

069   

070   

071 strcpy(buffer,"Hello,World! 从服务器来!");  

072 strcat(buffer,"\n"); //C语言字符串连接  

073   

074   

075 send(new_server_socket,buffer,BUFFER_SIZE,0);  

076   

077   

078 bzero(buffer,BUFFER_SIZE);  

079 //接收客户端发送来的信息到buffer中  

080 length = recv(new_server_socket,buffer,BUFFER_SIZE,0);  

081   

082 if (length < 0)  

083 {  

084 printf("Server Recieve Data Failed!\n");  

085 exit(1);  

086 }  

087 printf("\n%s",buffer);  

088   

089   

090 if((stream = fopen("data1","r"))==NULL)  

091 {  

092 printf("The file 'data1' was not opened! \n");  

093 exit(1);  

094 }  

095 else

096   

097 printf("The file 'filename' was opened! \n");  

098 bzero(buffer,BUFFER_SIZE);  

099   

100 int lengsize = 0;  

101 while((lengsize = fread(buffer,1,1024,stream)) > 0)  

102 {  

103   

104 printf("lengsize = %d\n",lengsize);  

105   

106 if(send(new_server_socket,buffer,lengsize,0)<0)  

107 {  

108 printf("Send File is Failed\n");  

109 break;  

110 }  

111   

112 bzero(buffer, BUFFER_SIZE);  

113   

114     

115   

116 }  

117 if(fclose(stream))  

118 printf("The file 'data' was not closed! \n");  

119 exit(1);         

120   

121 //关闭与客户端的连接  

122 close(new_server_socket);         

123 }  

124 //关闭监听用的socket  

125 close(server_socket);  

126 return 0;  

127 }



[代码] client.c
view sourceprint?001 ////////////////////////////////////  

002 //客户端代码  

003 ///////////////////////////////////  

004   

005 //本文件是客户机的代码  

006 #include <netinet/in.h>    // for sockaddr_in  

007 #include <sys/types.h>    // for socket  

008 #include <sys/socket.h>    // for socket  

009 #include <stdio.h>        // for printf  

010 #include <stdlib.h>        // for exit  

011 #include <string.h>        // for bzero  

012 #include <time.h>                //for time_t and time  

013 #include <arpa/inet.h>  

014   

015 #define HELLO_WORLD_SERVER_PORT    7754  

016 #define BUFFER_SIZE 1024  

017   

018 int main(int argc, char **argv)  

019 {  

020 if (argc != 2)  

021 {  

022 printf("Usage: ./%s ServerIPAddress\n",argv[0]);  

023 exit(1);  

024 }  

025   

026 //time_t now;  

027 FILE *stream;  

028   

029 //设置一个socket地址结构client_addr,代表客户机internet地址, 端口  

030 struct sockaddr_in client_addr;  

031 bzero(&client_addr,sizeof(client_addr)); //把一段内存区的内容全部设置为0  

032 client_addr.sin_family = AF_INET;    //internet协议族  

033 client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自动获取本机地址  

034 client_addr.sin_port = htons(0);    //0表示让系统自动分配一个空闲端口  

035 //创建用于internet的流协议(TCP)socket,用client_socket代表客户机socket  

036 int client_socket = socket(AF_INET,SOCK_STREAM,0);  

037 if( client_socket < 0)  

038 {  

039 printf("Create Socket Failed!\n");  

040 exit(1);  

041 }  

042 //把客户机的socket和客户机的socket地址结构联系起来  

043 if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)))  

044 {  

045 printf("Client Bind Port Failed!\n");  

046 exit(1);  

047 }  

048   

049 //设置一个socket地址结构server_addr,代表服务器的internet地址, 端口  

050 struct sockaddr_in server_addr;  

051 bzero(&server_addr,sizeof(server_addr));  

052 server_addr.sin_family = AF_INET;  

053 if(inet_aton(argv[1],&server_addr.sin_addr) == 0) //服务器的IP地址来自程序的参数  

054 {  

055 printf("Server IP Address Error!\n");  

056 exit(1);  

057 }  

058 server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);  

059 socklen_t server_addr_length = sizeof(server_addr);  

060 //向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接  

061 if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0)  

062 {  

063 printf("Can Not Connect To %s!\n",argv[1]);  

064 exit(1);  

065 }  

066   

067 char buffer[BUFFER_SIZE];  

068 bzero(buffer,BUFFER_SIZE);  

069   

070   

071 //从服务器接收数据到buffer中  

072 int length = recv(client_socket,buffer,BUFFER_SIZE,0);  

073   

074 if(length < 0)  

075 {  

076 printf("Recieve Data From Server %s Failed!\n", argv[1]);  

077 exit(1);  

078 }  

079   

080   

081 printf("\n%s\n",buffer);  

082   

083 bzero(buffer,BUFFER_SIZE);  

084   

085     

086   

087 bzero(buffer,BUFFER_SIZE);  

088 strcpy(buffer,"Hello, World! From Client\n");  

089 //向服务器发送buffer中的数据  

090 send(client_socket,buffer,BUFFER_SIZE,0);  

091   

092 if((stream = fopen("data","w+t"))==NULL)  

093 {  

094 printf("The file 'data' was not opened! \n");  

095 }  

096   

097 else

098 bzero(buffer,BUFFER_SIZE);  

099 length = 0;  

100 while( length = recv(client_socket,buffer,BUFFER_SIZE,0))  

101 {  

102 if(length < 0)  

103 {  

104 printf("Recieve Data From Server %s Failed!\n", argv[1]);  

105 break;  

106 }  

107   

108 int write_length = fwrite(buffer,sizeof(char),length,stream);  

109 if (write_length<length)  

110 {  

111 printf("File is Write Failed\n");  

112 break;  

113 }  

114 bzero(buffer,BUFFER_SIZE);   

115 }  

116 printf("Recieve File From Server[%s] Finished\n", argv[1]);  

117   

118 //关闭 文件  

119 fclose(stream);  

120   

121 //关闭socket  

122 close(client_socket);  

123 return 0;  

124 }

论坛徽章:
0
2 [报告]
发表于 2010-12-27 14:40 |只看该作者
好代码 收藏 没事拿来研究研究 公司不让上QQ 巨汗》。。

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
3 [报告]
发表于 2010-12-27 14:44 |只看该作者
好乱看起来

论坛徽章:
0
4 [报告]
发表于 2010-12-27 15:10 |只看该作者
本帖最后由 pagx 于 2010-12-27 15:28 编辑
  1. ////////////////////////////////////
  2. //服务器代码
  3. ///////////////////////////////////
  4. //本文件是服务器的代码

  5. #include <netinet/in.h>    // for sockaddr_in
  6. #include <sys/types.h>     // for socket

  7. #include <sys/socket.h>    // for socket
  8. #include <stdio.h>         // for printf
  9. #include <stdlib.h>        // for exit
  10. #include <string.h>        // for bzero
  11. #include <time.h>          //for time_t and time

  12. #define HELLO_WORLD_SERVER_PORT 7754
  13. #define LENGTH_OF_LISTEN_QUEUE 20
  14. #define BUFFER_SIZE 1024

  15. int main(int argc, char **argv)
  16. {
  17.         //设置一个socket地址结构server_addr, 代表服务器internet地址, 端口
  18.         struct sockaddr_in server_addr;
  19.         bzero(&server_addr, sizeof(server_addr)); //把一段内存区的内容全部设置为0
  20.         server_addr.sin_family = AF_INET;
  21.         server_addr.sin_addr.s_addr = htons(INADDR_ANY);
  22.         server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
  23.         // time_t now;
  24.         FILE *stream;

  25.         //创建用于internet的流协议(TCP)socket, 用server_socket代表服务器socket
  26.         int server_socket = socket(AF_INET,SOCK_STREAM,0);
  27.         if (server_socket < 0) {
  28.                 printf("Create Socket Failed!");
  29.                 exit(1);
  30.         }

  31.         //把socket和socket地址结构联系起来
  32.         if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr))) {
  33.                 printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
  34.                 exit(1);
  35.         }

  36.         //server_socket用于监听
  37.         if (listen(server_socket, LENGTH_OF_LISTEN_QUEUE)) {
  38.                 printf("Server Listen Failed!");
  39.                 exit(1);
  40.         }

  41.         //服务器端要一直运行
  42.         while (1) {
  43.                 struct sockaddr_in client_addr;
  44.                 socklen_t length = sizeof(client_addr);

  45.                 int new_server_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);
  46.                 if (new_server_socket < 0) {
  47.                         printf("Server Accept Failed!\n");
  48.                         break;
  49.                 }

  50.                 char buffer[BUFFER_SIZE];
  51.                 bzero(buffer, BUFFER_SIZE);

  52.                 strcpy(buffer, "Hello, World! 从服务器来!");
  53.                 strcat(buffer, "\n"); //C语言字符串连接

  54.                 send(new_server_socket, buffer, BUFFER_SIZE, 0);

  55.                 bzero(buffer, BUFFER_SIZE);
  56.                 //接收客户端发送来的信息到buffer中
  57.                 length = recv(new_server_socket, buffer, BUFFER_SIZE, 0);

  58.                 if (length < 0) {
  59.                         printf("Server Recieve Data Failed!\n");
  60.                         exit(1);
  61.                 }

  62.                 printf("\n%s", buffer);

  63.                 if((stream = fopen("data1", "r")) == NULL) {
  64.                         printf("The file 'data1' was not opened! \n");
  65.                         exit(1);
  66.                 }
  67.                 else
  68.                         printf("The file 'filename' was opened! \n");
  69.                 bzero(buffer, BUFFER_SIZE);

  70.                 int lengsize = 0;
  71.                 while ((lengsize = fread(buffer,1,1024,stream)) > 0) {
  72.                         printf("lengsize = %d\n", lengsize);
  73.                         if (send(new_server_socket, buffer, lengsize, 0) < 0) {
  74.                                 printf("Send File is Failed\n");
  75.                                 break;
  76.                         }

  77.                         bzero(buffer, BUFFER_SIZE);
  78.                 }

  79.                 if(fclose(stream))
  80.                         printf("The file 'data' was not closed! \n");
  81.                 exit(1);

  82.                 //关闭与客户端的连接
  83.                 close(new_server_socket);
  84.         }

  85.         //关闭监听用的socket
  86.         close(server_socket);
  87.         return 0;
  88. }

  89. ////////////////////////////////////
  90. //客户端代码
  91. ///////////////////////////////////

  92. //本文件是客户机的代码
  93. #include <netinet/in.h>    // for sockaddr_in
  94. #include <sys/types.h>    // for socket
  95. #include <sys/socket.h>    // for socket
  96. #include <stdio.h>        // for printf
  97. #include <stdlib.h>        // for exit
  98. #include <string.h>        // for bzero
  99. #include <time.h>                //for time_t and time
  100. #include <arpa/inet.h>

  101. #define HELLO_WORLD_SERVER_PORT    7754
  102. #define BUFFER_SIZE 1024

  103. int main(int argc, char **argv)
  104. {
  105.         if (argc != 2) {
  106.                 printf("Usage: ./%s ServerIPAddress\n", argv[0]);
  107.                 exit(1);
  108.         }

  109.         //time_t now;
  110.         FILE *stream;

  111.         //设置一个socket地址结构client_addr,代表客户机internet地址, 端口
  112.         struct sockaddr_in client_addr;
  113.         bzero(&client_addr, sizeof(client_addr)); //把一段内存区的内容全部设置为0
  114.         client_addr.sin_family = AF_INET;    //internet协议族
  115.         client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自动获取本机地址
  116.         client_addr.sin_port = htons(0);    //0表示让系统自动分配一个空闲端口
  117.         //创建用于internet的流协议(TCP)socket,用client_socket代表客户机socket
  118.         int client_socket = socket(AF_INET, SOCK_STREAM, 0);
  119.         if( client_socket < 0) {
  120.                 printf("Create Socket Failed!\n");
  121.                 exit(1);
  122.         }
  123.         //把客户机的socket和客户机的socket地址结构联系起来
  124.         if( bind(client_socket, (struct sockaddr*)&client_addr, sizeof(client_addr))) {
  125.                 printf("Client Bind Port Failed!\n");
  126.                 exit(1);
  127.         }

  128.         //设置一个socket地址结构server_addr,代表服务器的internet地址, 端口
  129.         struct sockaddr_in server_addr;
  130.         bzero(&server_addr, sizeof(server_addr));
  131.         server_addr.sin_family = AF_INET;
  132.         //服务器的IP地址来自程序的参数
  133.         if(inet_aton(argv[1], &server_addr.sin_addr) == 0) {
  134.                 printf("Server IP Address Error!\n");
  135.                 exit(1);
  136.         }
  137.         server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
  138.         socklen_t server_addr_length = sizeof(server_addr);
  139.         //向服务器发起连接, 连接成功后client_socket代表了客户机和服务器的一个socket连接
  140.         if (connect(client_socket, (struct sockaddr*)&server_addr, server_addr_length) < 0) {
  141.                 printf("Can Not Connect To %s!\n", argv[1]);
  142.                 exit(1);
  143.         }

  144.         char buffer[BUFFER_SIZE];
  145.         bzero(buffer, BUFFER_SIZE);

  146.         //从服务器接收数据到buffer中
  147.         int length = recv(client_socket, buffer, BUFFER_SIZE, 0);

  148.         if(length < 0) {
  149.                 printf("Recieve Data From Server %s Failed!\n", argv[1]);
  150.                 exit(1);
  151.         }

  152.         printf("\n%s\n", buffer);
  153.         bzero(buffer, BUFFER_SIZE);

  154.         bzero(buffer, BUFFER_SIZE);
  155.         strcpy(buffer, "Hello, World! From Client\n");
  156.         //向服务器发送buffer中的数据
  157.         send(client_socket, buffer, BUFFER_SIZE, 0);

  158.         if ((stream = fopen("data","w+t")) == NULL) {
  159.                 printf("The file 'data' was not opened! \n");
  160.         } else
  161.                 bzero(buffer, BUFFER_SIZE);

  162.         length = 0;
  163.         while (length = recv(client_socket, buffer, BUFFER_SIZE, 0)) {
  164.                 if (length < 0) {
  165.                         printf("Recieve Data From Server %s Failed!\n", argv[1]);
  166.                         break;
  167.                 }

  168.                 int write_length = fwrite(buffer, sizeof(char), length, stream);
  169.                 if (write_length < length) {
  170.                         printf("File is Write Failed\n");
  171.                         break;
  172.                 }

  173.                 bzero(buffer, BUFFER_SIZE);
  174.         }
  175.         printf("Recieve File From Server[%s] Finished\n", argv[1]);

  176.         //关闭 文件
  177.         fclose(stream);

  178.         //关闭socket
  179.         close(client_socket);
  180.         return 0;
  181. }

复制代码

论坛徽章:
0
5 [报告]
发表于 2010-12-27 15:27 |只看该作者
用code吧,好乱哦

exit()的时候,会关闭文件描述符,但是最好在bind等操作失败之后关闭文件描述符吧,因为你的程序将来肯定不会一有问题就exit吧,尤其是server

论坛徽章:
0
6 [报告]
发表于 2010-12-27 16:22 |只看该作者
好 当demo用 省事
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP