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
- linux网络编程-UDP实现文件的传输
- Linux网络编程之使用UDP传输文件
- linux下网络编程3:UDP广播传输文件
- Linux网络编程之使用UDP传输文件
- Linux c==网络编程的理论知识-如何让UDP实现可靠传输 (24)
- Windows Socket编程之UDP实现大文件的传输
- LINUX下实现UDP传输文件
- 网络编程UDP的socket编程实现(linux下)
- 网络编程之UDP传输
- java 网络编程 基于TCP ,UDP的网络传输
- Linux C——网络编程传输文件的实验
- Java实现 Windows Socket编程 UDP实现大文件的传输
- linux网络编程之断点传输文件
- Linux下网络编程实现UDP
- Linux下网络编程实现UDP
- Linux下网络编程实现UDP
- Linux下网络编程实现UDP
- Lesson_for_java_day22--java的网络编程(IP、URL、UDP传输)
- redis集群的Cluster方式配置以及spring的集成
- Leetcode笔记:(MySQL)181. Employees Earning More Than Their Managers
- the specified license key not be verified as belonging to this host
- <C语言>实现输入几个数,先倒叙排列,再用“冒泡排序”方法从小到大排列
- 深度学习笔记——理论与推导之Structured Learning【Markov Logic Network】(十一)
- linux网络编程-UDP实现文件的传输
- 【转载】Android Studio NDK 开发与调试(生成 .so 文件)
- qduoj water problem(线段树)
- The container 'Maven Dependencies' references non existing library '
- Shader 标准贴图代码参考笔记
- gcc pthread_create()方法使用
- (poj 3667) Hotel(区间更新)
- java8的新特性
- C语言排序算法的演示