linux网络编程-UDP实现文件的传输

来源:互联网 发布:超级seo 编辑:程序博客网 时间:2024/05/21 05:36

server.c

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <unistd.h>#define PORT 4000#define BUFLEN 1024             //每次接收的数据#define ERR_EXIT(m) \do\{\perror(m);\exit(1);\}while(0);int main(){int myfd,hefd;struct sockaddr_in seraddr,cliaddr;char readbuf[BUFLEN] = {0};int addrlen;int ret;FILE *fp;unsigned int count = 0;int writen = 0;if(-1 == (myfd = socket(PF_INET,SOCK_DGRAM,0)))     //产生UDP套接字  ERR_EXIT("socket");bzero(&seraddr,sizeof(seraddr));seraddr.sin_family  = AF_INET;seraddr.sin_port = htons(PORT);seraddr.sin_addr.s_addr = htonl(INADDR_ANY);if(-1 == bind(myfd,(struct sockaddr*)&seraddr,sizeof(seraddr)))   //绑定套接字  ERR_EXIT("bind");fp = fopen("/home/albert/fly_copy.txt","w");   //打开文件,如果文件不存在,则生成新的空文件,此文件用于接收从客户端发来的数据addrlen = sizeof(struct sockaddr);while(1){memset(readbuf,0,BUFLEN);             //清空缓存if( -1 == (ret = recvfrom(myfd,readbuf,BUFLEN,0,(struct sockaddr*)&cliaddr,&addrlen)))  ERR_EXIT("recvfrom");if(9 == ret)                               //当客户端发完数据后,再发一个结束标志的字符串给服务器端,服务器端收到这个标志后{           //说明全部数据接收完毕,则关闭文件指针,如果不这么做,不关闭文件指针,则最后会有部分数据不能够正确写入if(! strncasecmp(readbuf,"11close11",9))  //结束字符串,自己定义即可{fclose(fp);//关闭文件指针printf("close file\n");break;                       //跳出循环}}writen = fwrite(readbuf,1,ret,fp);         //把收到的数据写入文件if(writen != ret){exit(1);}printf("receive ret = %d\n",ret);         //后面这三行主要用于检验服务器端是否能够全部接收客户端的数据,只是检查用printf("count = %d\n",count);count++;}close(myfd);return 0;}

client.c

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <netinet/in.h>#include <sys/socket.h>#include <errno.h>#include <sys/types.h>#include <string.h>#define PORT 4000#define IP "127.0.0.1"#define BUFLEN 512int main(){int clifd;struct sockaddr_in seraddr;char writebuf[BUFLEN];int ret;FILE *fp;FILE *wfp;unsigned int count = 0;int readn;long file_len = 0;long len = 0;if(-1 == (clifd = socket(AF_INET,SOCK_DGRAM,0))){perror("socket");exit(1);}bzero(&seraddr,sizeof(seraddr));seraddr.sin_family = AF_INET;seraddr.sin_port = htons(PORT);seraddr.sin_addr.s_addr = inet_addr(IP);fp = fopen("/home/albert/Fly.txt","r");    //打开文件,只读fseek(fp,0L,SEEK_END);                   //把文件指针定位到最后file_len = ftell(fp);                   //计算出文件有多少个字节fseek(fp,0L,SEEK_SET);                  //把文件指针定位到开始的位置len = file_len;memset(writebuf,0,BUFLEN);while(!feof(fp)){readn = fread(writebuf,1,BUFLEN,fp);if(BUFLEN > file_len){if(-1 == (ret = sendto(clifd,writebuf,file_len,0,(struct sockaddr*)&seraddr,sizeof(struct sockaddr)))){perror("sendto");exit(1);}}else{if(-1 == (ret = sendto(clifd,writebuf,BUFLEN,0,(struct sockaddr*)&seraddr,sizeof(struct sockaddr)))){perror("sendto");exit(1);}file_len -= BUFLEN;}memset(writebuf,0,BUFLEN);printf("ret = %d\n",ret);printf("count = %u\n",count);count++;}/*while(( readn = (fread(writebuf,1,BUFLEN,fp)) )> 0){if(-1 == (ret = sendto(clifd,writebuf,BUFLEN,0,(struct sockaddr*)&seraddr,sizeof(struct sockaddr)))){perror("sendto");exit(1);}//memset(writebuf,0,BUFLEN);printf("ret = %d\n",ret);printf("count = %u\n",count);count++;memset(writebuf,0,BUFLEN);}*/printf("break readn = %d\n",readn);printf("break ret = %d\n",ret);printf("file_len = %ld\n",len);printf("read file_len = %ld\n",file_len);char notice[9] = "11close11";if(-1 == (ret = sendto(clifd,notice,9,0,(struct sockaddr*)&seraddr,sizeof(struct sockaddr)))){exit(1);}close(clifd);fclose(fp);return 0;}




阅读全文
0 0
原创粉丝点击