FTP 1.0
自己写的可以实现文件的下载(必须自己知道文件名),还有很多要优化。
譬如:不能看可以下载的文件,输入错误无法处理,不能处理多个用户,每次只能下载一个结束,服务器没有完成守护进程;没有用函数封装,简化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 != )
{
printf("EXE IP PORT");
exit();
} //socket
int clientfd = socket(AF_INET,SOCK_STREAM,);
if(clientfd == -)
{
perror("clientfd");
exit();
} struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(argv[]);
serveraddr.sin_port = htons(atoi(argv[])); if(- == connect(clientfd,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr)))
{
perror("connect");
exit();
} //send
char send_buf[SIZE]="";
fgets(send_buf,sizeof(send_buf),stdin);
send(clientfd,send_buf,strlen(send_buf),); //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)-]='\0';
FILE* fp = fopen(send_buf,"w"); char recv_buf[SIZE] = "";
recv(clientfd,recv_buf,sizeof(recv_buf)-,);
//printf("recv:%s\n",recv_buf);
fwrite(recv_buf,,strlen(recv_buf),fp); fclose(fp); close(clientfd); return ;
}
高级功能:实现文件夹选择下载,断点续传。(目前实现由困难)
服务器端代码: 头文件
#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 != )
{
printf("EXE IP PORT\n");
exit();
}
//socket
int serverfd = socket(AF_INET,SOCK_STREAM,);
if(serverfd == -)
{
perror("socket");
exit();
} //bind
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(argv[]);
serveraddr.sin_port = htons(atoi(argv[])); if(- == bind(serverfd,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr)))
{
perror("bind");
exit();
} //listen
if(- == listen(serverfd,))
{
perror("listen");
exit();
} //accept
int clientfd;
struct sockaddr_in clientaddr;
socklen_t clientlen = sizeof(clientaddr); clientfd = accept(serverfd,(struct sockaddr*)&clientaddr,&clientlen);
if(clientfd == -)
{
perror("accept");
exit();
} 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)-,); sprintf(FULL_PATH,"%s/%s",DOWN_PATH,recv_buf);
FULL_PATH[strlen(FULL_PATH)-] = '\0';
printf("download file:%s\n",FULL_PATH); //open file
FILE* fp = fopen(FULL_PATH,"r");
if(fp == NULL)
{
perror("fopen");
exit();
} //read file
char send_buf[SIZE] = "";
size_t readn;
readn = fread(send_buf,,sizeof(send_buf),fp);
printf("readn:%d\n",readn); //send
size_t sendn;
sendn = send(clientfd,send_buf,strlen(send_buf),);
if(sendn == -)
{
perror("sendn");
exit();
} printf("sendn:%d\n",sendn); close(clientfd);
close(serverfd); //while(1);
return ;
}
FTP 1.0的更多相关文章
- Python的网络编程[1] -> FTP 协议[0] -> FTP 的基本理论
FTP协议 / FTP Protocol FTP全称为File Transfer Protocol(文件传输协议),常用于Internet上控制文件的双向传输,常用的操作有上传和下载.基于TCP/IP ...
- ftp同步代码
一个很naive的代码,用来做ftp的"主->从 下载,从->主 上传".ftp可不像mysql那样还有log可以用,所以完全naive的做法:连到ftp server ...
- FTP传输文件
感谢其他技术人员的分享.我转发,添加个人使用. public class TransFTP {/// <summary> /// 上传文件 /// </summary> /// ...
- 使用python操作FTP上传和下载
函数释义 Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件,函数列举如下 ftp登陆连接 from ftplib import F ...
- Ubuntu 16.04 安装ftp服务器传输文件
最近在搞深度学习,老师比较宝贝他的服务器,要求我以后负责管理服务器.往后所有要使用服务器的人都必须向我申请账号,然后只允许客户端访问,使用文件传输软件传输文件.像我这样一个linux菜逼,这种要求不是 ...
- linux配置ftp
参考: http://www.cnblogs.com/acpp/archive/2010/02/08/1665876.html http://blog.csdn.net/huzhenwei/artic ...
- python 基于windows环境的ftp功能
描述: 1.基于备份服务器部署的py程序,将需要备份主机目录下的内容下载至备份服务器(服务端和远端都是windows server 2008) 2.py程序部署在windows服务器,后台运行,基于b ...
- gcc-5.4.0 static dwarf2 compile
------------------------------------------------------------------------------- 又开始折腾了, 静态编译 gcc-5.4 ...
- PHP ftp使用
本文章来总结几个利用php中的ftp功能来实现通过FTP上传文件,有需要学习的朋友可参考参考.ftp_get() 函数从 FTP 服务器上下载一个文件.若成功则返回 true,失败则返回 false. ...
随机推荐
- QC使用中问题点汇总
QC 使用中问题点汇总,包括以下四个方面: 1.不兼容IE7,IE8的问题(服务器端设置) 2.无法在Win 7下正常下载页面(客户端设置) 3.在QC中填写中文内容后无法正常提交到数据库(客户端设置 ...
- Bitcode问题
原因:Xcode7 及以上版本会默认开启 bitcode .bitcode具体是什么就不解释了.解决方法:1.更新library使包含Bitcode,否则会出现以上的警告.2.关闭Bitcode,简单 ...
- 第十三节,基本数据类型,数字int字符串str
基本数据类型 数字 int 字符串 str 布尔值 bool 列表 list 元组 tuple 字典 dict 数据类型关系图 查看一个对象的类 如:如查看对象变量a是什么类 用到函 ...
- Python识别网站验证码
http://drops.wooyun.org/tips/6313 Python识别网站验证码 Manning · 2015/05/28 10:57 0x00 识别涉及技术 验证码识别涉及很多方面的内 ...
- hdu_5806_NanoApe Loves Sequence Ⅱ(双指针)
题目链接:hdu_5806_NanoApe Loves Sequence Ⅱ 题意: 给你一段数,问你有多少个区间满足第K大的数不小于m 题解: 直接双指针加一下区间就行 #include<cs ...
- openwrt uci
UCI: Unified Configuration Interface 通用配置接口,主要用于集中控制openwrt的配置文件. 1.uci使用的配置文件一般放置在设备上的/etc/config目录 ...
- why TCP guarentee delivery?
Simple idea: just use a TIMEOUT, if no answer after a certain seconds, just re-deliver!
- docker Swarm 集群发现
Node 发现 $swarm manage --discovery dockerhost01:,dockerhost02:,dockerhost03: -H= 文件发现 $swarm manage - ...
- ECShop - 数据库操作类
ECShop v2.7.2没有使用一些开源的数据库操作类,比如adodb或者PEAR,而是封装了自己的实现.这样做的好处是实现非常轻量,只有一个文件,27Kb,大大减小了分发包的文件大小.另外,当网站 ...
- psy
本文的重点是讲解如何运用心理线指标看盘,运用周线月线的心理线来抓住大盘的顶部和底部的研究.分析研究的材料都来源于沪市历史上的顶部和底部的历史数据.从psy数据所得出的结论大多数是有效的,只有个别时期的 ...