利用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;}

测试结果
利用TCP/UDP完成文件传输的设计和实现
文件传输成功,同理,音频图片视频都可以用这个代码传输

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