赞
踩
UDP.h
#ifndef NETWORK_UDP_H #define NETWORK_UDP_H #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <strings.h> #include <string.h> #include <stdlib.h> #include <arpa/inet.h> #include <pthread.h> #include <fcntl.h> #include <sys/stat.h> #include <ctype.h> #endif //NETWORK_UDP_H
一切过程都在注释
service.c
//使用UDP实现文件的传输 #include "UDP.h" #define SPORT 7788 char buf[1024]; int main(int argc ,char *argv[]){ int sockfd; FILE *fp;//使用标准IO存客户端发送过来的文件 struct sockaddr_in s,c;//服务器地质结构,客户端地质结构 bzero(&s,sizeof(s));//清空 s.sin_family=AF_INET; //初始化 s.sin_port=htons(SPORT); s.sin_addr.s_addr=htonl(INADDR_ANY); socklen_t len=sizeof(s); if ((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){//选socket套接字 perror("[socket]"); return -1; } if ((bind(sockfd,(struct sockaddr *)&s,len))==-1){//进行IP地址加端口号绑定 perror("[bind]"); return -1; } //绑定成功就接受客户端要发送的文件名 int ret;//用于检测recvfrom函数的返回值,检错。 len=sizeof(c); ret=recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&c,&len); if (ret==-1){ perror("[recvfrom]"); return -1; } //客户端发送过来的是一个文件的路径,所以这里需要对路径进行相应的分解 char filename[100]; int i=0,k=0; for ( i = strlen(buf); i >0 ; i--) { if (buf[i]!='/'){ k++; } else break; } //定位这个文件的名字 strncat(filename,buf+(strlen(buf)-k)+1,k); char filepath[100]="/tmp/"; strncat(filepath,filename,strlen(filename)); printf("FILE : %s will be download!\n",filepath);//使用printf跟踪打印技术检错 fp=fopen(filepath,"w+");//创建,可读可写 if (fp==NULL){ perror("[fopen]"); return -1; } //制造空洞文件 if ((truncate(filepath,1<<10))==-1){ perror("[truncate]"); return -1; } //清空buf空间来接受传过来的文件内容 while (ret){ bzero(buf,sizeof(buf)); len=sizeof(c); ret=recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&c,&len); if ((fwrite(buf,sizeof(char),ret,fp))==-1){ perror("[fwrite]"); exit(-1); } } printf("Download success!\n"); }
client.c
#include "UDP.h" char buf[1024]; int main(int argc,char *argv[]){ int sockfd; char filepath[100]="/home/jacky/hujie.txt"; struct sockaddr_in s; bzero(&s,sizeof(s)); s.sin_family=AF_INET; s.sin_port=htons(7788); inet_pton(AF_INET,"192.168.200.134",&s.sin_addr.s_addr); if ((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){//选择socket perror("[socket]"); return -1; } //直接进行发送文件名 int ret,ret_r;//用于检错 if ((ret=sendto(sockfd,filepath,sizeof(filepath),0,(struct sockaddr *)&s,sizeof(s)))==-1){ perror("[sento]"); return -1; } //进行文件内容的数据传输 FILE *fp; fp=fopen(filepath,"r"); if (fp==NULL){ perror("[fopen]"); return -1; } //读取文件内容到buf中 while (ret){ bzero(buf,sizeof(buf)); ret_r=fread(buf,sizeof(char ),1024,fp); if (ret_r==-1){ perror("[fread]"); return -1; } ret=sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&s,sizeof(s));//这里要注意传输内容的大小,是你读取到在buf中的大小,不能直接使用sizeof(buf) usleep(100);//防止出现粘包乱码 } printf("transfer success\n"); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。