您的位置:首页 > 编程语言 > PHP开发

FTP 1.0

2015-06-05 11:55 543 查看
自己写的可以实现文件的下载(必须自己知道文件名),还有很多要优化。

譬如:不能看可以下载的文件,输入错误无法处理,不能处理多个用户,每次只能下载一个结束,服务器没有完成守护进程;没有用函数封装,简化main程序。

高级功能:支持文件夹选择下载,断点续传,尝试用多线程,多进程,线程池处理多个请求。

客户端代码:
头文件
#ifndef __CLIENT_COMMON__
#define __CLIENT_COMMON__

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include<sys/types.h>
#include<sys/socket.h>

#include<netinet/in.h>
#include<arpa/inet.h>

#include<unistd.h>
#include<fcntl.h>

#define SIZE 1024
#define DOWN_PATH "/home/luolizhi/Downloads"

#endif

client main

#include"client_common.h"

int main(int argc, char* argv[])    //serverip port
{
if(argc != 3)
{
printf("EXE IP PORT");
exit(1);
}

//socket
int clientfd = socket(AF_INET,SOCK_STREAM,0);
if(clientfd == -1)
{
perror("clientfd");
exit(1);
}

struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
serveraddr.sin_port = htons(atoi(argv[2]));

if(-1 == connect(clientfd,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr)))
{
perror("connect");
exit(1);
}

//send
char send_buf[SIZE]="";
fgets(send_buf,sizeof(send_buf),stdin);
send(clientfd,send_buf,strlen(send_buf),0);

//recv
/*
char FULL_PATH[SIZE]="";
sprintf(FULL_PATH,"%s/%s",DOWN_PATH,send_buf);
FULL_PATH[strlen(FULL_PATH)-1]='\0';
*/
send_buf[strlen(send_buf)-1]='\0';
FILE* fp = fopen(send_buf,"w");

char recv_buf[SIZE] = "";
recv(clientfd,recv_buf,sizeof(recv_buf)-1,0);
//printf("recv:%s\n",recv_buf);
fwrite(recv_buf,1,strlen(recv_buf),fp);

fclose(fp);

close(clientfd);

return 0;
}


高级功能:实现文件夹选择下载,断点续传。(目前实现由困难)

服务器端代码:

头文件
#ifndef __SERVER_COMMON__
#define __SERVER_COMMON__

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//socket
#include<sys/types.h>
#include<sys/socket.h>
//inet
#include<netinet/in.h>
#include<arpa/inet.h>
//FILE
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

#define DOWN_PATH "/home/luolizhi/Downloads"
#define SIZE 1024

void recvn(int sfd,int len);
void sendn(int sfd,int len);

#endif

main 程序
#include"server_common.h"

int main(int argc, char* argv[])    //ip port
{
if(argc != 3)
{
printf("EXE IP PORT\n");
exit(1);
}
//socket
int serverfd = socket(AF_INET,SOCK_STREAM,0);
if(serverfd == -1)
{
perror("socket");
exit(1);
}

//bind
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
serveraddr.sin_port = htons(atoi(argv[2]));

if(-1 == bind(serverfd,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr)))
{
perror("bind");
exit(1);
}

//listen
if(-1 == listen(serverfd,10))
{
perror("listen");
exit(1);
}

//accept
int clientfd;
struct sockaddr_in clientaddr;
socklen_t clientlen = sizeof(clientaddr);

clientfd = accept(serverfd,(struct sockaddr*)&clientaddr,&clientlen);
if(clientfd == -1)
{
perror("accept");
exit(1);
}

printf("client: ip:%s,port:%d on\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));

//recv
char recv_buf[SIZE] = "";
char FULL_PATH[SIZE] = "";

recv(clientfd,recv_buf,sizeof(recv_buf)-1,0);

sprintf(FULL_PATH,"%s/%s",DOWN_PATH,recv_buf);
FULL_PATH[strlen(FULL_PATH)-1] = '\0';
printf("download file:%s\n",FULL_PATH);

//open file
FILE* fp = fopen(FULL_PATH,"r");
if(fp == NULL)
{
perror("fopen");
exit(1);
}

//read file
char send_buf[SIZE] = "";
size_t readn;
readn = fread(send_buf,1,sizeof(send_buf),fp);
printf("readn:%d\n",readn);

//send
size_t sendn;
sendn = send(clientfd,send_buf,strlen(send_buf),0);
if(sendn == -1)
{
perror("sendn");
exit(1);
}

printf("sendn:%d\n",sendn);

close(clientfd);
close(serverfd);

//while(1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: