博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

linux网络环境下socket套接字编程(UDP文件传输)

Posted on 2015-10-27 22:19  梦茴初夏  阅读(2150)  评论(0编辑  收藏  举报

今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作!

在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输。

在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux网络编程中,使用UDP进行传输属于比较简单的操作,所以直接上代码吧,详细的讲解我将会在之后上传!

client(客户端):

  1     #include <stdio.h>
  2     #include <string.h>
  3     #include <stdlib.h>
  4     #include <sys/socket.h>
  5     #include <netinet/in.h>
  6     #include <sys/types.h>
  7     #include <fcntl.h>
  8     #include <sys/stat.h>
  9     #include "protocol.h"
 10 
 11     /*--------------------------*/
 12     int socketfd ;
 13     int addrlen;
 14     struct sockaddr_in server;
 15     struct protocol sentbuf;
 16     struct protocol recvbuf;
 17     int num;
 18     char ip[20];
 19     int port;
 20     int choice ;
 21     char filename[100];
 22 
 23     /*--------------------------*/
 24     void ShowMenu();
 25     void DownLoad();
 26     void UpLoad();
 27     void ShutDown();
 28 
 29 
 30     int main(){
 31     /*---------------------------*/
 32         socketfd = socket(AF_INET , SOCK_DGRAM , 0 );
 33         if(socketfd == -1){
 34             perror("socket failed!\n");
 35             exit(1);
 36         }
 37     /*---------------------------*/
 38         printf("please input ip of server:\n");
 39         scanf("%s",ip);
 40         printf("please input port of server:\n");
 41         scanf("%d",&port);
 42     /*---------------------------*/
 43         bzero(&server , sizeof(server));
 44         server.sin_family = AF_INET;
 45         server.sin_port = htons(port);
 46         server.sin_addr.s_addr = inet_addr(ip);
 47         addrlen = sizeof(server);
 48     /*---------------------------*/
 49         while(1){
 50             ShowMenu();
 51             scanf("%d",&choice);
 52             if(choice == DOWNLOAD){
 53                 printf("client download!\n");
 54                 DownLoad();
 55             }
 56             else if(choice == UPLOAD){
 57                 UpLoad();
 58             }
 59             else if(choice == SHUTDOWN){
 60                 printf("client shutdown!\n");
 61                 ShutDown();
 62                 break;
 63             }
 64             else{
 65                 printf("please input the right choice!\n");
 66             }
 67         }
 68         close(socketfd);
 69         return 0;
 70     }
 71 
 72     void ShowMenu(){
 73         printf("please make a choice:\n");
 74         printf("0:shutdown!\n");
 75         printf("1:download!\n");
 76         printf("2:upload!\n");
 77     }
 78 
 79     void DownLoad(){
 80         bzero(&recvbuf , sizeof(recvbuf));
 81         bzero(&sentbuf , sizeof(sentbuf));
 82         bzero(filename , sizeof(filename));
 83         printf("please input the filename:\n");
 84         scanf("%s",sentbuf.buf);
 85         sentbuf.command = DOWNLOAD;
 86         sendto(socketfd , &sentbuf , sizeof(sentbuf), 0 , (struct sockaddr*)&server , sizeof(server));
 87         bcopy(sentbuf.buf , filename , sizeof(sentbuf.buf));
 88         recvfrom(socketfd  , &recvbuf , sizeof(recvbuf) , 0 , (struct sockaddr*)&server , &addrlen);
 89         printf("recvbuf:%d\n",recvbuf.command);
 90         if(recvbuf.command == YES){
 91             printf("YES!\n");
 92             int choice_1;
 93             printf("if you input a 5 , the file transmission start!\n");
 94             scanf("%d",&choice_1);
 95             if(choice_1 == START){
 96                 sentbuf.command = START;
 97                 sendto(socketfd , &sentbuf , sizeof(sentbuf) , 0 , (struct sockaddr*)&server , sizeof(server));
 98                 int no = 0 ;
 99                 int fd = open(filename , O_CREAT | O_TRUNC | O_WRONLY , 0644 );
100                 if(fd < 0){
101                     perror("creat file is failed!\n");
102                     exit(1);
103                 }
104                 bzero(&recvbuf , sizeof(recvbuf));
105                 while( ( num = recvfrom(socketfd , &recvbuf , sizeof(recvbuf) , 0 , (struct sockaddr*)&server , &addrlen)) > 0){
106                     if( recvbuf.command == CONTENT ){
107                         if(no == recvbuf.no){
108                             write(fd , recvbuf.buf , recvbuf.len);
109                             bzero(&recvbuf , sizeof(recvbuf));
110                         }
111                         else{
112                             perror("The file no is not same,  Some massage is missed!error occured!\n");
113                             break;
114                         }
115                     }
116                     if( recvbuf.command == END){
117                         close(fd);
118                         printf("transmission is successful!\n");
119                         break;
120                     }
121                 }
122             }
123         }
124         else if(recvbuf.command == NO){
125             perror("No such file on server!\n");
126         }
127         else{
128             perror("recvbuf.command error!\n");
129             exit(1);
130         }
131     }
132 
133     void ShutDown(){
134         sentbuf.command = SHUTDOWN;
135         sendto(socketfd , &sentbuf , sizeof(sentbuf) , 0 , (struct sockaddr*)&server , sizeof(server));
136         printf("client is end!\n");
137     }
138 
139     void UpLoad(){
140         bzero(&recvbuf , sizeof(recvbuf));
141         bzero(&sentbuf , sizeof(sentbuf));
142         bzero(filename , sizeof(filename));
143         printf("please input you want to upload filename:\n");
144         scanf("%s",sentbuf.buf);
145         sentbuf.command = UPLOAD;
146         sendto(socketfd , &sentbuf , sizeof(sentbuf), 0 , (struct sockaddr*)&server , sizeof(server));
147         bcopy(sentbuf.buf , filename , sizeof(sentbuf.buf));
148         int fd ;
149         fd = open(filename , O_RDONLY);
150         if(fd < 0){
151             perror("The file is not exist!\n");
152             exit(1);
153         }
154         recvfrom(socketfd , &recvbuf , sizeof(recvbuf), 0 , (struct sockaddr*)&server , &addrlen);
155         if( recvbuf.command == START ){
156             int no = 0 ;
157             while( ( num = read(fd , sentbuf.buf , INFOLEN)) > 0 ){
158                 sentbuf.no = no ;
159                 sentbuf.command = CONTENT;
160                 sentbuf.len = strlen(sentbuf.buf);
161                 sendto(socketfd , &sentbuf , sizeof(sentbuf) , 0 , (struct sockaddr*)&server,sizeof(server));
162                 no++;
163                 bzero(&sentbuf , sizeof(sentbuf));
164             }
165             bzero(&sentbuf , sizeof(sentbuf));
166             sentbuf.command = END;
167             sendto(socketfd , &sentbuf , sizeof(sentbuf) , 0 , (struct sockaddr*)&server , sizeof(server));
168         }
169         else if(recvbuf.command == NO){
170             printf("not transmission!\n");
171         }
172         else{
173             perror("error! wrong choice!\n");
174         }
175     }

server(服务端):

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 #include <sys/socket.h>
  5 #include <netinet/in.h>
  6 #include <sys/types.h>
  7 #include <fcntl.h>
  8 #include <sys/stat.h>
  9 #include "protocol.h"
 10 
 11 int socketfd;
 12 int addrlen;
 13 struct sockaddr_in server;
 14 struct sockaddr_in client;
 15 struct protocol sentbuf;
 16 struct protocol recvbuf;
 17 int num;
 18 char ip[20];
 19 int port;
 20 int choice;
 21 char filename[100];
 22 
 23 void DownLoad();
 24 void ShutDown();
 25 void UpLoad();
 26 
 27 int main(){
 28     socketfd = socket( AF_INET , SOCK_DGRAM , 0 );
 29     if( socketfd == -1){
 30             perror("socket failed!\n");
 31             exit(1);
 32     }
 33 
 34     printf("please input client ip:\n");
 35     scanf("%s" , ip);
 36     printf("please input client port:\n");
 37     scanf("%d",&port);
 38 
 39     bzero(&server , sizeof(server));
 40     server.sin_family = AF_INET;
 41     server.sin_port = htons(port);
 42     server.sin_addr.s_addr = inet_addr(ip);
 43 
 44     int bin = bind(socketfd , (struct sockaddr*)&server , sizeof(server));
 45     if(bin == -1){
 46         perror("bind failed!\n");
 47         exit(1);
 48     }
 49 
 50     addrlen = sizeof(client);
 51     //char filename[100];
 52 
 53     while(1){
 54         bzero(&recvbuf , sizeof(recvbuf));
 55         num = recvfrom(socketfd , &recvbuf , sizeof(recvbuf) , 0 , (struct sockaddr*)&client , &addrlen);
 56         choice = recvbuf.command;
 57         bcopy(recvbuf.buf ,filename, sizeof(recvbuf.buf));
 58         printf("%s\n",filename);
 59         if(choice == DOWNLOAD){
 60             printf("kkkkkkkk\n");
 61             DownLoad();
 62         }
 63         else if(choice == SHUTDOWN){
 64             printf("server will shutdown!\n");
 65             ShutDown();
 66             break;
 67         }
 68         else if(choice == UPLOAD){
 69             UpLoad();
 70         }
 71     }
 72     return 0;
 73 }
 74 
 75 void DownLoad(){
 76     char buf[100];
 77     int fd ;
 78     printf("11111\n");
 79     printf("%s\n",filename);
 80     fd = open((filename) , O_RDONLY);
 81     printf("fd:%d\n",fd);
 82     bzero(&sentbuf , sizeof(sentbuf));
 83     if(fd < 0){
 84         sentbuf.command = NO;
 85         sendto(socketfd , &sentbuf , sizeof(sentbuf) , 0 , (struct sockaddr*)&client , sizeof(client));
 86         printf("no such file!\n");
 87         exit(1);
 88     }
 89     else{
 90         sentbuf.command = YES;
 91         printf("YES!\n");
 92         sendto(socketfd , &sentbuf, sizeof(sentbuf) , 0 , (struct sockaddr*)&client , sizeof(client));
 93         recvfrom(socketfd , &recvbuf , sizeof(recvbuf) , 0 , (struct sockaddr*)&client , &addrlen);
 94         if(recvbuf.command == START){
 95             int no = 0 ;
 96             while((num = read(fd , sentbuf.buf , INFOLEN)) > 0){
 97                 sentbuf.no = no ;
 98                 sentbuf.command = CONTENT;
 99                 sentbuf.len = strlen(sentbuf.buf);
100                 sendto(socketfd , &sentbuf , sizeof(sentbuf),0,(struct sockaddr*)&client , sizeof(client));
101                 no++;
102                 bzero(&sentbuf , sizeof(sentbuf));
103             }
104             bzero(&sentbuf , sizeof(sentbuf));
105             sentbuf.command = END;
106             sendto(socketfd , &sentbuf , sizeof(sentbuf) , 0 , (struct sockaddr*)&client , sizeof(client));
107         }
108     }
109 }
110 
111 void ShutDown(){
112     printf("Now server is shutdown!\n");
113 }
114 
115 
116 void UpLoad(){
117         //bzero(&recvbuf , sizeof(recvbuf));
118         bzero(&sentbuf , sizeof(sentbuf));
119         bzero(&filename , sizeof(filename));
120         //recvfrom(socketfd , &recvbuf , sizeof(recvbuf) , 0 , (struct sockaddr*)&client , &addrlen);
121         printf("4:NO 5:START\n");
122         scanf("%d" , &sentbuf.command);
123         sendto(socketfd , &sentbuf , sizeof(sentbuf) , 0 , (struct sockaddr*)&client , sizeof(client));
124         if( sentbuf.command == START){
125             int no = 0 ;
126             printf("filename:%s\n",recvbuf.buf);
127             int fd = open(recvbuf.buf , O_CREAT | O_TRUNC | O_WRONLY , 0644 );
128             if(fd < 0){
129                 perror("create file failed!\n");
130                 exit(1);
131             }
132             bzero(&recvbuf , sizeof(recvbuf) );
133             while(( num = recvfrom(socketfd , &recvbuf , sizeof(recvbuf) , 0 , (struct sockaddr*)&client , &addrlen)) > 0){
134                 if( recvbuf.command == CONTENT ){
135                     if( no == recvbuf.no ){
136                         write(fd , recvbuf.buf , recvbuf.len);
137                         bzero(&recvbuf , sizeof(recvbuf));
138                     }
139                     else{
140                         perror("The file no is not same . Some massage is missed!\n");
141                         break;
142                     }
143                 }
144                 if( recvbuf.command == END ){
145                     close(fd);
146                     printf("transmission is successful!\n");
147                     break;
148                 }
149             }
150         }
151         else if( sentbuf.command == NO ){
152             printf("The file can't transmission!\n");
153         }
154         else{
155             perror("please input right choice!\n");
156             exit(1);
157         }
158 }

makefile:

main:udpserver.o udpclient.o
    gcc -o udpserver udpserver.o
    gcc -o udpclient udpclient.o
udpserver.o:udpserver.c
    gcc -c udpserver.c
udpclient.o:udpclient.c
    gcc -c udpclient.c