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 }