ftp server来源分析20140602
ftp server学习位和源代码分析片
记录自己的第一个开源的分析过程:
从源代码:野狐灯(我接下来的几篇文章是从源头:野狐灯,每个以下哪项不是他们设置。)
20140602
Ftp的源码目录例如以下
dxyh.h dxyh_lib.c 包裹函数(经常使用的)
dxyh_thread.h dxyh_thread_lib.c 线程包裹函数
Ftpd.h ftpd.c 主代码
ftpd_main.c 程序入口
error.h error.c 错误处理的函数
record.h record.c 生成相关的记录
Makefile makefile文件
readme 自己加入的改动的记录
首先是把每一个文件大致浏览了一下知道大概的过程
从ftpd_main.c開始分析之旅
//ftpd_main.c
2 #include <stdio.h>
3 #include "ftpd.h"
4 #include "record.h"
5 #include "error.h"
6 #include "dxyh.h"
7
8 int main(int argc, char **argv)
9 {
10 int listenfd;
11
12 ftpd_init();
13 ftpd_parse_args(argc, argv);
14 listenfd = ftpd_create_serv();
15 ftpd_do_loop(listenfd);
16 return 0;
17 }
18
在ftpd.c 中大概看了一下 ftpd_init();感觉没什么
再看ftpd_parse_args(argc,argv)
感觉内容挺多的,
先看了一下以下这个函数
getopt_long()
#include <getopt.h>
2函数原型
编辑
int getopt_long(int argc, char * const argv[],
const char *optstring,
const struct option *longopts, int *longindex);
3函数说明
编辑
getopt被用来解析命令行选项參数。
getopt_long支持长选项的命令行解析,使用man getopt_long,得到其声明例如以下:
int getopt_long(int argc, char * const argv[],const char *optstring, const struct option *longopts,int *longindex);
函数中的argc和argv通常直接从main()的两个參数传递而来。
optsting是选项參数组成的字符串:
字符串optstring能够下列元素:
1.单个字符,表示选项,
2.单个字符后接一个冒号:表示该选项后必须跟一个參数。參数紧跟在选项后或者以空格隔开。
该參数的指针赋给optarg。
3 单个字符后跟两个冒号,表示该选项后能够有參数也能够没有參数。
假设有參数。參数必须紧跟在选项后不能以空格隔开。该參数的指针赋给optarg。
(这个特性是GNU的扩张)。
optstring是一个字符串,表示能够接受的參数。比如,"a:b:cd"。表示能够接受的參数是a,b,c,d,当中,a和b參数后面跟有很多其它的參数值。(比如:-a host -b name)
參数longopts,事实上是一个结构的实例:
struct option {
const char *name; //name表示的是长參数名
int has_arg; //has_arg有3个值,no_argument(或者是0),表示该參数后面不跟參数值
// required_argument(或者是1),表示该參数后面一定要跟个參数值
// optional_argument(或者是2),表示该參数后面能够跟。也能够不跟參数值
int *flag;
//用来决定。getopt_long()的返回值究竟是什么。
假设flag是null(通常情况),则函数会返回与该项option匹配的val值;假设flag不是NULL。则将val值赋予flag所指向的内存。而且返回值设置为0。
int val; //和flag联合决定返回值
}
參数longindex,表示当前长參数在longopts中的索引值。[1]
给个样例:
struct option long_options[] = {
{"a123", required_argument, 0, 'a'},
{"c123", no_argument, 0, 'c'},
}
如今,假设命令行的參数是-a 123,那么调用getopt_long()将返回字符'a',而且将字符串123由optarg返回(注意注意!字符串123由optarg带回!
optarg不须要定义,在getopt.h中已经有定义),那么。假设命令行參数是-c。那么调用getopt_long()将返回字符'c',而此时,optarg是null。
最后。当getopt_long()将命令行所有參数所有解析完毕后。返回-1。
4注意
编辑
required_argument(或者是1)时。參数输入格式为:--參数 值 或者 --參数=值。
optional_argument(或者是2)时,參数输入格式仅仅能为:--參数=值。
5范例
编辑
#include <stdio.h>
#include <getopt.h>
char *l_opt_arg;
char* const short_options = "nbl:";
struct option long_options[] = {
{ "name", 0, NULL, 'n' },
{ "bf_name", 0, NULL, 'b' },
{ "love", 1, NULL, 'l' },
{ 0, 0, 0, 0},
};
int main(int argc, char *argv[])
{
int c;
while((c = getopt_long (argc, argv, short_options, long_options, NULL)) != -1)
{
switch (c)
{
case 'n':
printf("My name is XL.\n");
break;
case 'b':
printf("His name is ST.\n");
break;
case 'l':
l_opt_arg = optarg;
printf("Our love is %s!\n", l_opt_arg);
break;
}
}
return 0;
}
[root@localhost wyp]# gcc -o getopt getopt.c
[root@localhost wyp]# ./getopt -n -b -l forever
My name is XL.
His name is ST.
Our love is forever!
[root@localhost liuxltest]#
[root@localhost liuxltest]# ./getopt -nb -l forever
My name is XL.
His name is ST.
Our love is forever!
[root@localhost liuxltest]# ./getopt -nbl forever
My name is XL.
His name is ST.
Our love is forever!
看到有err_msg()这个函数
在error.c 中找到这个函数
又查找va_list 的使用方法
va_list
VA_LIST 是在C语言中解决变參问题的一组宏,所在头文件:#include <stdarg.h>
#ifdef _M_ALPHA
typedef struct {
char *a0; /* pointer to first homed integer argument */
int offset; /* byte offset of next parameter */
} va_list;
#else
typedef char * va_list;
#endif
_M_ALPHA是指DEC ALPHA(Alpha AXP)架构。
所以普通情况下va_list所定义变量为字符[1]指针。
宏
INTSIZEOF 宏,获取类型占用的空间长度,最小占用长度为int的整数倍:
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
~是位取反的意思。
_INTSIZEOF(n)整个做的事情就是将n的长度化为int长度的整数倍。
比方n为5。二进制就是101b,int长度为4,二进制为100b,那么n化为int长度的整数倍就应该为8。
~(sizeof(int) - 1) )就应该为~(4-1)=~(00000011b)=11111100b。这样不论什么数& ~(sizeof(int) - 1) )后最后两位肯定为0,就肯定是4的整数倍了。
(sizeof(n) + sizeof(int) - 1)就是将大于4m但小于等于4(m+1)的数提高到大于等于4(m+1)但小于4(m+2)。这样再& ~(sizeof(int) - 1) )后就正好将原长度补齐到4的倍数了。
VA_START宏。获取可变參数列表的第一个參数的地址(ap是类型为va_list的指针,v是可变參数最右边的參数):
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
VA_ARG宏,获取可变參数的当前參数,返回指定类型并将指针指向下一參数(t參数描写叙述了当前參数的类型):
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
VA_END宏。清空va_list可变參数列表:
#define va_end(ap) ( ap = (va_list)0 )
3使用方法
编辑
(1)首先在函数里定义一具VA_LIST型的变量。这个变量是指向參数的指针。
(2)然后用VA_START宏初始化刚定义的VA_LIST变量;
(3)然后用VA_ARG返回可变的參数,VA_ARG的第二个參数是你要返回的參数的类型(假设函数有多个可变參数的。依次调用VA_ARG获取各个參数);
(4)最后用VA_END宏结束可变參数的获取。
4注意问题
编辑
(1)可变參数的类型和个数全然由程订购代码控制,它不智能识别不同参数的数量和类型;
(2)假设我们并不需要每个参数一一详细解释。仅需要被复制到缓冲器变量列表,可用的vsprintf功能;
(3)由于编译器检查的函数原型可变参数不够严谨格,故障排除不利的编程.它并不能帮助我们写出高质量的代码;
感觉很多东西,快来硬着头皮继续往下看!
ftp server来源分析20140602的更多相关文章
- NAT后面的FTP SERVER终极篇
原文引用:http://blog.chinaunix.net/uid-20592805-id-1918661.html 如果对于被动模式还有不同的意见,我们可以再看下这篇文章: http://ww ...
- apache ftp server的简单入门(java应用内嵌ftp server)
Apache Ftp Server:(强调) Apache Ftp Server 是100%纯Java的FTP服务器软件,它采用MINA网络框架开发具有非常好的性能.Apache FtpServer ...
- apache ftp server的简单入门(数据库验证)
apache的简单校验分为两种,一直是前面提到的properties的校验,具体参考:apache ftp server的简单入门(properties验证) 今天来说一种数据库的校验,这种方式在项目 ...
- VC FTP服务器程序分析(三)
CControlSocket类的分析,CControlSocket类的内容比较多,为什么呢.因为通信控制命令的传输全部在这里,通信协议的多样也导致了协议解析的多样. 1.OnReceive 其大致说 ...
- python项目开发:ftp server开发
程序要求: 1.用户加密认证 (对用户名密码进行MD5验证)2.允许同时多用户登陆 (使用socket server方法,为每个用户都创建一个信息文件)3.每个用户有自己的家目录,且只能访问自己的家目 ...
- 基于JMeter的Quick Easy FTP Server性能测试
FTP性能测试 1.引言 1.1背景说明 本测试选用的是一个小型的FTP服务器软件:Quick Easy FTP Server.Quick Easy FTP Server是一个全中文的FTP服务器软件 ...
- Guidance of Set up FTP Server
Step 1. Create a FTP folder in your C disk, named "FTPReport"(an example) Step 2. Install ...
- How to set up an FTP server on Ubuntu 14.04
How to set up an FTP server on Ubuntu 14.04 Setting up a fully-functional and highly secure FTP serv ...
- 多线程查询FTP Server上的文件
情形是这样的,最近做一个自动化的项目,当batch跑成功了,FTP Server上会有特定的生成文件.但是不确定是什么时候会有,大概是batch跑完了5分钟之内吧,所以在脚本里设置检查点的时候,需要每 ...
随机推荐
- [LeetCode]Palindrome Partitioning 找出所有可能的组合回文
给定一个字符串,切割字符串,这样每个子字符串是一个回文字符串. 要找出所有可能的组合. 办法:暴力搜索+回溯 class Solution { public: int *b,n; vector< ...
- linux、hdfs、hive、hbase经常使用的命令
linux经常使用命令 pwd 查看当前工作文件夹的绝对路径 cat input.txt 查看input.txt文件的内容 ls 显示当前文件夹下全部的文件及子文件夹 rm recommender-d ...
- enumerateObjectsUsingBlock、enumerateObjectsWithOptions、enumerateObjectsAtIndexes、makeObjectsPerfor使用
OC至 NSArray它提供了一个方便的遍历block,以下具体说明 第一.enumerateObjectsUsingBlock NSArray *array=@[@"aa",@& ...
- AndroidService 深度分析(2)
AndroidService 深度分析(2) 上一篇文章我们Service的生命周期进行了測试及总结. 这篇文章我们介绍下绑定执行的Service的实现. 绑定执行的Service可能是仅为本应用提供 ...
- JAVA Socket超时浅析(转)
套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的“终端”.针对一个特定的连接,每台机器上都有一个“套接字”,可以想象它们之间有一条虚拟的“线缆”.JAVA有两个基于数据流 ...
- URAL 1553. Caves and Tunnels 树链拆分
一颗树 每次出发点右键值是0 2操作模式1.第一i右键点值添加x 2.乞讨u至v在这条路上右上方值 树为主的连锁分裂称号 #include <cstdio> #include <cs ...
- 通过ccb(CocosBuilder)文件生成cocos2dx代码
在C++下使用ccb.绑定调用,成员变量.让人头疼又easy犯错. 自己用pythong写了个小程序,通过ccb文件直接生成C++代码 python我用的不多.又是随性所做.代码质量就非常差.大家多多 ...
- poj 1975 Median Weight Bead(传递闭包 Floyd)
链接:poj 1975 题意:n个珠子,给定它们之间的重量关系.按重量排序.求确定肯定不排在中间的珠子的个数 分析:由于n为奇数.中间为(n+1)/2,对于某个珠子.若有至少有(n+1)/2个珠子比它 ...
- [WebView其中一项研究]:Web Apps基本介绍
今天,我们开始了解WebView,以及Web Apps发展,从主要内容Android实际的例子来解释正式文件和后续. (博客地址:http://blog.csdn.net/developer_jian ...
- Maven+Spring
Maven+Spring 关于Maven Maven是一个用于项目构建的工具,通过它便捷的管理项目的生命周期.即项目的jar包依赖,开发,测试,发布打包. 做过.NET的人应该会联想到Nuget,是的 ...