利用TCP/UDP完成文件传输的设计和实现
2017-12-12 17:17
1086 查看
利用TCP/UDP完成文件传输的设计和实现
1) 利用循环面向连接的模型完成固定文件的传输(考虑服务器地址、端口号的设定方式)2) 由固定文件扩展成手动输入或选择文件;
3) 参考connectTCP的方式对程序进行抽象、封装;
客户端
建立socket 确定服务器scokaddr_in结构体 点分十进制IP转换 使用connect连接 打开文件 准备缓冲区 缓冲区初始化置空 将文件内容读入缓冲区 使用send将缓冲区内容发送到服务器 文件内容发送完成 关闭文件 关闭socket
服务器
建立socket 确定服务器scokaddr_in结构体 点分十进制IP转换 使用bind绑定套接字 使用listen监听 使用accept接受连接请求 accept返回新的套接字描述符 使用recv接收传来的数据(文件路径) 打开文件,这里需要文件名 从该字符串获取文件名 使用recv接收文件内容 判断recv函数返回的状态 将接收到的内容放入缓冲区 将缓冲区内容写入文件 关闭文件 关闭socket
客户端代码
#include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <string.h> #include <netinet/in.h> #include <errno.h> #include <memory.h> #include <stdlib.h> //for malloc #define BUFFER_SIZE 1024 int main() { int sockcd; struct sockaddr_in server; char filepath[100];//file to translate FILE *fp; int lenpath; //filepath length char *buffer;//file buffer int fileTrans; buffer = (char *)malloc(sizeof(char)*BUFFER_SIZE); bzero(buffer,BUFFER_SIZE); //memset(buffer,0,sizeof(buffer)); if((sockcd = socket(AF_INET,SOCK_STREAM,0))<0) { printf("socket build error!\n"); } memset(&server,0,sizeof(server)); server.sin_family= AF_INET; server.sin_port = htons(6666); if(inet_pton(AF_INET,"192.168.61.143",&server.sin_addr)<0) { printf("inet_pton error!\n"); } if(connect(sockcd,(struct sockaddr*)&server,sizeof(server))<0) { printf("connect error!\n"); }//connect with server printf("file path:\n"); scanf("%s",filepath);//get filepath fp = fopen(filepath,"r");//opne file if(fp==NULL) { printf("filepath not found!\n"); return 0; } printf("filepath : %s\n",filepath); lenpath = send(sockcd,filepath,strlen(filepath),0);// put file path to sever if(lenpath<0) { printf("filepath send error!\n"); } else { printf("filepath send success!\n"); } sleep(3); while((fileTrans = fread(buffer,sizeof(char),BUFFER_SIZE,fp))>0) { printf("fileTrans =%d\n",fileTrans); if(send(sockcd,buffer,fileTrans,0)<0) { printf("send failed!\n"); break; } bzero(buffer,BUFFER_SIZE); //memset(buffer,0,sizeof(buffer)); } fclose(fp); close(sockcd); return 0; }
服务器端代码
#include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <string.h> #include <netinet/in.h> #include <errno.h> #include <memory.h> #include <stdlib.h> //for malloc #define MAXLINE 4096 #define BUFFER_SIZE 1024 int main() { int sockfd,temp,n; struct sockaddr_in server,client; char filename[100]; char filepath[100]; char *buffer;//file buffer int fileTrans; buffer = (char *)malloc(sizeof(char)*BUFFER_SIZE); bzero(buffer,BUFFER_SIZE); //memset(buffer,0,sizeof(buffer)); int lenfilepath; FILE *fp; int writelength; if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0) { printf("socket build error!\n"); } else { printf("socket build success!\n"); } memset(&server,0,sizeof(server)); server.sin_family= AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(6666); if((bind(sockfd,(struct sockaddr*)&server,sizeof(server)))==-1) { printf("bind error!\n"); } else { printf("bind success!\n"); } if(listen(sockfd,10)==-1) { printf("listen error!\n"); } else { printf("listen success!\n"); } printf("waiting..\n"); while(1) { if((temp = accept(sockfd,(struct sockaddr*)NULL,NULL))>0) { //printf("client IP: %d\n",ntohl(client.sin_addr.s_addr)); //printf("client PORT: %d\n",ntohs(client.sin_port)); memset(filename,'\0',sizeof(filename)); memset(filepath,'\0',sizeof(filepath)); lenfilepath = recv(temp,filepath,100,0); printf("filepath :%s\n",filepath); if(lenfilepath<0) { printf("recv error!\n"); } else { int i=0,k=0; for(i=strlen(filepath);i>=0;i--) { if(filepath[i]!='/') { k++; } else break; } strcpy(filename,filepath+(strlen(filepath)-k)+1); } printf("filename :%s\n",filename); fp = fopen(filename,"w"); if(fp!=NULL) { while(fileTrans =recv(temp,buffer,BUFFER_SIZE,0)) { if(fileTrans<0) { printf("recv error!\n"); break; } writelength = fwrite(buffer,sizeof(char),fileTrans,fp); if(writelength <fileTrans) { printf("write error!\n"); break; } bzero(buffer,BUFFER_SIZE); //memset(buffer,0,sizeof(buffer)); } printf("recv finished!\n"); fclose(fp); } else { printf("filename is null!\n"); } close(temp); } else { printf("accept error!\n"); close(temp); } } close(sockfd); return 0; }
测试结果
文件传输成功,同理,音频图片视频都可以用这个代码传输
相关文章推荐
- Socket网络程序设计(3) ———— 利用tcp完成文件传输的设计和实现
- tcp udp实现文件传输(java)
- C++ 利用socket实现TCP,UDP网络通讯
- 用UDP实现可靠文件传输,如何利用UDX创建一个简单的WIN32程序
- 利用TCP和UDP协议,实现基于Socket的小聊天程序(初级版)
- 用UDP实现可靠文件传输,如何利用UDX创建一个简单的WIN32程序
- 利用TCP和UDP协议,实现基于Socket的小聊天程序
- 关于利用Tcp库来实现文件传输
- 一个UDP实现文件传输的设计--待续...
- 利用IO完成端口实现高性能的UDP或TCP通信
- 利用TCP与UDP实现通讯
- 一个UDP实现文件传输的设计--待续...
- 利用TCP实现多客户聊天系统
- 设计技巧9:内部类利用外部类方法实现公共接口 封装实现细节
- 利用UDX进行P2P文件传输,UDP可靠文件传输
- 利用jquery完成表单域的收集,利用ajax实现信息传递给服务器存储
- Java Socket实现基于TCP和UDP多线程通信
- SSH开发框架中,实现系统启动加载类,读取数据库常用数据进入内存,利用Spring托管,并完成reload功能
- 基于 IOCP 的通用异步 Windows Socket TCP 高性能服务端组件的设计与实现
- TCP 和 UDP 传输的深入浅析,MSN 和 QQ 文件传输速度解析