利用TCP/UDP完成文件传输的设计和实现
来源:互联网 发布:type3浮雕雕刻软件 编辑:程序博客网 时间:2024/06/09 13:42
利用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 1024int 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 1024int 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;}
测试结果
文件传输成功,同理,音频图片视频都可以用这个代码传输
阅读全文
0 0
- 利用TCP/UDP完成文件传输的设计和实现
- Socket网络程序设计(3) ———— 利用tcp完成文件传输的设计和实现
- 一个UDP实现文件传输的设计--待续...
- 一个UDP实现文件传输的设计--待续...
- UDP文件传输的实现
- UDP文件传输的实现
- 利用IO完成端口实现高性能的UDP或TCP通信
- tcp udp实现文件传输(java)
- 转载:UDP文件传输的实现
- 关于利用Tcp库来实现文件传输
- TCP和UDP服务器的设计
- TCP和UDP传输的深入浅析,MSN和QQ文件传输速度解析
- TCP 和 UDP 传输的深入浅析,MSN 和 QQ 文件传输速度解析
- 利用TCP和UDP协议,实现基于Socket的小聊天程序(初级版)
- 用UDP实现可靠文件传输,如何利用UDX创建一个简单的WIN32程序
- 用UDP实现可靠文件传输,如何利用UDX创建一个简单的WIN32程序
- tcp 和 udp 的区别 ,及 udp 实现可靠传输
- 实现UDP的可靠文件传输 练习
- 文件的创建、关闭及相关指令
- 最小二乘法及算法实现
- php 去掉图片的宽度、高度设置
- 安卓Retrofit post请求 带参数
- FTM下执行full test,进入camera test卡住,稍后手机重启
- 利用TCP/UDP完成文件传输的设计和实现
- JQuery 制作文字轮播
- Redis集群
- resultType与resultMap区别
- 把Boostnote内的数据在云平台同步的方法
- Duilib msg.sType类型
- 「图文」教你微信上投票怎样刷票之如何快速微信拉票通过免费微信互投群万人群操作
- c++学习笔记之类
- PAT甲级1008. Elevator (20)