基于TCP协议简单的文件传输
来源:互联网 发布:网络社区的主要形式 编辑:程序博客网 时间:2024/04/28 07:39
能够实现简单的文件上传和下载.
服务器端程序:
/*********************:****************************************************
> File Name: server.c
> Author:
> Mail:
> Created Time: Thu 11 Jun 2015 12:34:37 AM PDT
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<strings.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netinet/ip.h> /* superset of previous */
#include<netinet/in.h>
#include<arpa/inet.h>
#include<errno.h>
#include<dirent.h>
#include<sys/stat.h>
#include<stddef.h>
void do_list(int connfd);
void do_get(int connfd,char *s);
void do_put(int connfd,char *s);
int main(int argc,const char *argv[])
{
char buff[1024];
int serverfd,connfd;
serverfd = socket(PF_INET,SOCK_STREAM,0);
if(serverfd ==-1)
{
perror("socket");
exit(EXIT_FAILURE);
}
struct sockaddr_in servaddr;
servaddr.sin_family = PF_INET;
servaddr.sin_port = htons(8888);
servaddr.sin_addr.s_addr = inet_addr("192.168.1.146");
if (bind(serverfd,(struct sockaddr*)&servaddr,sizeof(servaddr))==-1)
{
perror("bind");
exit(EXIT_FAILURE);
}
printf("bind success!\n");
if(listen(serverfd,8)==-1)
{
perror("listen");
exit(EXIT_FAILURE);
}
printf("listen...\n");
connfd = accept(serverfd,NULL,NULL);
if(connfd == -1)
{
perror("accept");
exit(EXIT_FAILURE);
}
printf("connected..\n");
while(1)
{
recv(connfd,buff,sizeof(buff),0);
printf("kehuduan:%s",buff);
if(strncmp(buff,"quit",4)==0)
{
printf("kehuduan xiaxianle\n");
//close(connfd);
break;
}
if(strncmp(buff,"list",4)==0)
{
do_list(connfd);
continue;
}
if(strncmp(buff,"get ",4)==0)
{
do_get(connfd,buff+4);
}
if(strncmp(buff,"put ",4)==0)
{
do_put(connfd,buff+4);
}
}
return 0;
}
void do_list(int connfd)
{
DIR *dp;
char buff2[1024];
struct dirent *ep;
struct stat st;
dp = opendir(".");
if(dp!=NULL)
{
while(ep = readdir(dp))
{
if(ep->d_name[0]!='.')
{
printf("d_name:%s\n",ep->d_name);
if(stat(ep->d_name,&st)!=-1)
{
strcat(buff2,ep->d_name);
strcat(buff2,"\n");
}
}
}
send(connfd,buff2,sizeof(buff2),0);
closedir(dp);
}
else
puts("Couldn't open directory.\n");
}
void do_get(int connfd,char *s)
{
DIR *dp;
struct dirent *ep;
struct stat st;
int total,sndbytes;
FILE *fp1;
char buff3[1024];
char buff4[1024];
bzero(buff3,sizeof(buff3));
bzero(buff4,sizeof(buff4));
strcat(buff3,s);
buff3[strlen(buff3)-1]='\0';
dp=opendir(".");
if(dp!=NULL)
{
while(ep=readdir(dp))
{
if(strcmp(buff3,ep->d_name)==0)
{
if(stat(ep->d_name,&st)!=-1)
{
total = st.st_size;
send(connfd,&total,sizeof(int),0);
printf("total = %d\n",total);
fp1 = fopen(ep->d_name,"r");
if(fp1==NULL)
{
printf("can not open!\n");
}
while(1)
{
if(total>=sizeof(buff4))
{
fread(buff4,1,sizeof(buff4),fp1);
sndbytes = send(connfd,buff4,sizeof(buff4),0);
total = total-sndbytes;
}
if(total<sizeof(buff4))
{
printf("haishengxia:%d\n",total);
fread(buff4,1,total,fp1);
send(connfd,buff4,total,0);
break;
}
}
}
}
}
closedir(dp);
}
else
puts("couldn't open the directory.\n");
}
void do_put(int connfd,char *s)
{
char buffer1[1024];
char filename[100];
bzero(filename,sizeof(filename));
FILE *fp2;
int total,recvbytes,num;
if(recv(connfd,&total,sizeof(int),0)==-1)
{
perror("recv");
exit(EXIT_FAILURE);
}
printf("shangchuan_size:%d\n",total);
strcat(filename,s);
filename[strlen(filename)-1] = '\0';
strcat(filename,"_input");
fp2 = fopen(filename,"w+");
while(1)
{
recvbytes = recv(connfd,buffer1,sizeof(buffer1),0);
fwrite(buffer1,1,sizeof(buffer1),fp2);
total = total - recvbytes;
if(total<sizeof(buffer1))
{
recvbytes = recv(connfd,buffer1,total,0);
fwrite(buffer1,1,recvbytes,fp2);
break;
}
}
}
客户端程序:
/*************************************************************************
> File Name: client.c
> Author:
> Mail:
> Created Time: Thu 11 Jun 2015 12:58:14 AM PDT
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <netinet/in.h>
#include <arpa/inet.h>
#include<errno.h>
#include<dirent.h>
#include<sys/stat.h>
#include<stddef.h>
#include<strings.h>
void list(int clientfd);
void put(int clientfd,char *s);
void get(int clientfd,char *s);
int main(int argc, const char *argv[])
{
int clientfd;
char buff[1024];
clientfd = socket(PF_INET,SOCK_STREAM,0);
if(clientfd == -1)
{
perror("socket");
exit(EXIT_FAILURE);
}
struct sockaddr_in servaddr;
servaddr.sin_family = PF_INET;
servaddr.sin_port = htons(8888);
servaddr.sin_addr.s_addr = inet_addr("192.168.1.146");
if(connect(clientfd,(struct sockaddr *)&servaddr,sizeof(servaddr))==-1)
{
perror("connect");
exit(EXIT_FAILURE);
}
printf("connect success!\n");
while(fgets(buff,sizeof(buff),stdin))
{
if( send(clientfd,buff,sizeof(buff),0)==-1)
{
perror("send");
exit(EXIT_FAILURE);
}
if(strncmp(buff,"help",4)==0)
{
printf("help:显示客户端所有命令和说明\n");
printf("list:显示服务器端可下载文件列表\n");
printf("get<file>:下载文件\n");
printf("put<file>:上传文件\n");
printf("quit:退出客户端\n");
}
if(strncmp(buff,"list",4)==0)
{
list(clientfd);
continue;
}
if(strncmp(buff,"quit",4)==0)
{
close(clientfd);
break;
}
if(strncmp(buff,"get ",4)==0)
{
get(clientfd,buff+4);
}
if(strncmp(buff,"put ",4)==0)
{
put(clientfd,buff+4);
}
}
return 0;
}
void list(int clientfd)
{
char buff2[1024];
if(recv(clientfd,buff2,sizeof(buff2),0)==-1)
{
perror("recv");
exit(EXIT_FAILURE);
}
printf("可下载文件:\n%s\n",buff2);
}
void get(int clientfd,char *s)
{
char buff4[1024];
char filename[100];
bzero(filename,sizeof(filename));
FILE *fp1;
int total,recvbytes,num;
if(recv(clientfd,&total,sizeof(int),0)==-1)
{
perror("recv");
exit(EXIT_FAILURE);
}
printf("total:%d\n",total);
strcat(filename,s);
filename[strlen(filename)-1] = '\0';
strcat(filename,"_copy");
printf("filename:%s\n",filename);
fp1 = fopen(filename,"w+");
//printf("101hang?\n");
while(1)
{
recvbytes = recv(clientfd,buff4,sizeof(buff4),0);
fwrite(buff4,1,sizeof(buff4),fp1);
total = total - recvbytes;
if(total<sizeof(buff4))
{
recvbytes = recv(clientfd,buff4,total,0);
fwrite(buff4,1,recvbytes,fp1);
break;
}
}
}
void put(int clientfd,char *s)
{
DIR *dp;
FILE *fp2;
struct dirent *ep;
struct stat st;
int total,sndbytes;
char buffer1[1024];
char buffer2[1024];
bzero(buffer1,sizeof(buffer1));
bzero(buffer2,sizeof(buffer2));
strcat(buffer1,s);
buffer1[strlen(buffer1)-1]='\0';
dp=opendir(".");
if(dp!=NULL)
{
while(ep=readdir(dp))
{
if(strcmp(buffer1,ep->d_name)==0)
{
if(stat(ep->d_name,&st)!=-1)
{
total = st.st_size;
send(clientfd,&total,sizeof(int),0);
printf("total bytes:%d\n",total);
fp2 = fopen(ep->d_name,"r");
if(fp2==NULL)
{
printf("can not open this file\n");
}
while(1)
{
if(total>=sizeof(buffer2))
{
fread(buffer2,1,sizeof(buffer2),fp2);
sndbytes = send(clientfd,buffer2,sizeof(buffer2),0);
total = total-sndbytes;
}
if(total<sizeof(buffer2))
{
printf("shengyu:%d\n",total);
fread(buffer2,1,total,fp2);
send(clientfd,buffer2,total,0);
break;
}
}
}
}
}
closedir(dp);
}
else
puts("can not open this directory\n");
}
- 基于TCP协议简单的文件传输
- 基于TCP的TFTP(Trivial File Transfer Protocol,简单文件传输协议) 的c编程实现
- 基于TCP的文件传输
- 基于TCP的文件传输
- 基于TCP的文件传输
- 基于TCP的文件传输
- 基于TCP协议的Socket通信(文件传输且续传)
- 基于UDP协议的文件传输
- 基于TCP协议的简单通信实现
- 基于TCP协议的文件传输,传输带文件名等信息的文件流
- 使用INDY TCP组件实现基于协议采用XML方式的文件传输
- linux/Windows 基于TCP协议的文件传输源码(有注释)
- Windows下基于TCP协议的大文件传输(流形式)
- Linux 基于TCP/IP的文件传输系统
- Linux下基于TCP的文件传输
- Linux下基于TCP的文件传输
- Qt:基于TCP的多线程文件传输工具
- TCP 协议文件传输示例
- 使用GCD
- 近年来,学习图像去雾不得不看的论文和源代码
- Linux 内核开发 - Eclipse内核开发环境搭建
- 黑马程序员------面向对象01
- 怎样配置git密匙
- 基于TCP协议简单的文件传输
- vitamio视频框架-导入方法
- DAO层,Service层,Controller层,View层
- [笔记]python pickle模块
- 通过脚本创建数据库与表
- Quarzt2D--图形上下文栈
- 黑马程序员——函数、递归函数
- Xcode4使用技巧
- 通过简单的方法适应iOS7中的UIViewController,同时兼容iOS6