1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 世界上最详细的Linux C udp实现文件传输

世界上最详细的Linux C udp实现文件传输

时间:2019-09-30 17:50:32

相关推荐

世界上最详细的Linux C udp实现文件传输

最重要的是掌握UDP的基本概念和使用

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 7788char 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++;} elsebreak;}//定位这个文件的名字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){//选择socketperror("[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");}

实验结果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。