1.1 UDP协议下实现文件的发送与接收

send.c

 1 //UDP协议下实现文件的发送与接收
 2 #include <stdio.h>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<error.h>
 6 #include<errno.h>
 7 #include<sys/types.h>
 8 #include<sys/socket.h>
 9 #include<netinet/in.h>
10 #include<netinet/ip.h>
11 #include<arpa/inet.h>
12 #include<signal.h>
13 #define error_exit(_errmsg_) error(EXIT_FAILURE,errno,_errmsg_)
14 #define SER_PORT 50000
15 #define SER_ADDR "192.168.1.104"
16 int main(char argc,const char*argv[])//send
17 {    
18     if(argc!=2)
19     {fprintf(stderr,"Usage:./client xxx.xxx\n");return -1;}
20     int sockfd=0;
21     struct sockaddr_in seraddr;
22     seraddr.sin_family=AF_INET;
23     seraddr.sin_port=htons(SER_PORT);
24     seraddr.sin_addr.s_addr=inet_addr(SER_ADDR);
25     if(-1==(sockfd=socket(AF_INET,SOCK_DGRAM,0)))
26         error_exit("fail to socket!");
27     //发文件名
28     if(-1==sendto(sockfd,argv[1],strlen(argv[1])+1,0,
29             (struct sockaddr*)&seraddr,sizeof(seraddr)))
30         error_exit("fail to sendto!");
31     char buff[1024]={0};
32     FILE* fp=NULL;
33     int ret=0;
34     if(NULL==(fp=fopen(argv[1],"r")))
35             error_exit("fail to fopen!");
36     //发文件
37     while(0!=(ret=fread(buff,sizeof(char),1024,fp)))
38         {
39             if(-1==sendto(sockfd,buff,ret,0,
40                 (struct sockaddr*)&seraddr,sizeof(seraddr)))
41                 error_exit("fail to sendto!");
42         }
43     //给对方发送结束信号
44     strcpy(buff,"|___|");
45 //    strcpy(buff,"quit");
46     if(-1==sendto(sockfd,buff,strlen(buff)+1,0,(struct sockaddr*)&seraddr,sizeof(seraddr)))
47                 error_exit("fail to sendto!");    
48     close(sockfd);
49     fclose(fp);
50     return 0;
51 }

recv.c

 1 //UDP协议下实现文件的发送与接收
 2 #include <stdio.h>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<error.h>
 6 #include<errno.h>
 7 #include<sys/types.h>
 8 #include<sys/socket.h>
 9 #include<netinet/in.h>
10 #include<netinet/ip.h>
11 #include<arpa/inet.h>
12 #include<signal.h>
13 #define error_exit(_errmsg_) error(EXIT_FAILURE,errno,_errmsg_)
14 #define SER_PORT 50000
15 //#define CLT_PORT 50001
16 #define SER_ADDR "192.168.1.104"
17 //#define CLT_ADDR "192.168.1.131"
18 
19 int main()//recv
20 {    
21     int sockfd=0;
22     char filename[64]={0};
23     char buff1[1024]={0};
24     struct sockaddr_in seraddr;
25     struct sockaddr_in cltaddr;
26     socklen_t addrlen=sizeof(cltaddr);
27     seraddr.sin_family=AF_INET;
28     seraddr.sin_port=htons(SER_PORT);
29     seraddr.sin_addr.s_addr=inet_addr(SER_ADDR);
30     
31     if(-1==(sockfd=socket(AF_INET,SOCK_DGRAM,0)))
32         error_exit("fail to socket!");
33     //绑定
34     if(-1==bind(sockfd,(struct sockaddr*)&seraddr,sizeof(seraddr)))
35         error_exit("fail to bind!");
36     //接收文件名
37     if(-1==recvfrom(sockfd,filename,sizeof(filename),0,(struct sockaddr*)&cltaddr,&addrlen))    
38         error_exit("fail to recvfrom!");
39 
40     FILE* fp=NULL;
41     int ret=0;
42     if(NULL==(fp=fopen(filename,"w")))
43         error_exit("fail to fopen!");
44     //接收文件
45     while(0<(ret=recvfrom(sockfd,buff1,sizeof(buff1),0,NULL,NULL)))
46     {
47         if(!strncmp(buff1,"|___|",5))break;
48 
49         fwrite(buff1,ret,1,fp);
50         fflush(fp);
51     }
52     fclose(fp);
53     close(sockfd);
54     return 0;
55 }

posted @ 2017-03-13 20:21  bkycrmn  阅读(2163)  评论(0)    收藏  举报