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的更多相关文章

  1. NAT后面的FTP SERVER终极篇

    原文引用:http://blog.chinaunix.net/uid-20592805-id-1918661.html   如果对于被动模式还有不同的意见,我们可以再看下这篇文章: http://ww ...

  2. apache ftp server的简单入门(java应用内嵌ftp server)

    Apache Ftp Server:(强调) Apache Ftp Server 是100%纯Java的FTP服务器软件,它采用MINA网络框架开发具有非常好的性能.Apache FtpServer ...

  3. apache ftp server的简单入门(数据库验证)

    apache的简单校验分为两种,一直是前面提到的properties的校验,具体参考:apache ftp server的简单入门(properties验证) 今天来说一种数据库的校验,这种方式在项目 ...

  4. VC FTP服务器程序分析(三)

    CControlSocket类的分析,CControlSocket类的内容比较多,为什么呢.因为通信控制命令的传输全部在这里,通信协议的多样也导致了协议解析的多样. 1.OnReceive  其大致说 ...

  5. python项目开发:ftp server开发

    程序要求: 1.用户加密认证 (对用户名密码进行MD5验证)2.允许同时多用户登陆 (使用socket server方法,为每个用户都创建一个信息文件)3.每个用户有自己的家目录,且只能访问自己的家目 ...

  6. 基于JMeter的Quick Easy FTP Server性能测试

    FTP性能测试 1.引言 1.1背景说明 本测试选用的是一个小型的FTP服务器软件:Quick Easy FTP Server.Quick Easy FTP Server是一个全中文的FTP服务器软件 ...

  7. Guidance of Set up FTP Server

    Step 1. Create a FTP folder in your C disk, named "FTPReport"(an example) Step 2. Install ...

  8. 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 ...

  9. 多线程查询FTP Server上的文件

    情形是这样的,最近做一个自动化的项目,当batch跑成功了,FTP Server上会有特定的生成文件.但是不确定是什么时候会有,大概是batch跑完了5分钟之内吧,所以在脚本里设置检查点的时候,需要每 ...

随机推荐

  1. vmware 10 注冊码

    先安装VMware Workstation 10.0原版,然后用以下的随意一个VMware Workstation序列号注冊 1Y0LW-4WJ9N-LZ5G9-Z81QP-92PN7 JU052-F ...

  2. google在线测试练习2

    Problem Given a list of space separated words, reverse the order of the words. Each line of text con ...

  3. 微软中国裁员曝光:在CD结束后!薪酬不变!

    聚众抗议的前诺基亚员工(腾讯科技配图) 腾讯科技 郭晓峰 腾讯科技刚刚获取了一份微软设备事业部中国区管理团队4日晚间发给被裁员工的补偿方案邮件. 邮件内容显示,微软承诺在收购诺基亚交易结束(2014年 ...

  4. HR筒子说:程序猿面试那点事(转)

    小屁孩曾经有过4年的招聘经验,期间见识了各种类型的程序猿:有大牛.有菜牛:有功成名就,有苦苦挣扎不知方向.等后来做了一枚程序猿之后发现,HR眼中的程序猿和程序猿中的HR都是不一样的.有感与此,从HR的 ...

  5. Java模式(适配器型号)

    今天阅读Java该适配器模式,这里有一个小的总结和下谈感受.对于将来使用. 首先.让我们有关适配器先说说. 适应是“来源”至“目标”适应.其中连接这两个的关系是适配器.它负责“源”过度到“目标”. 举 ...

  6. [LeetCode202]Happy Number判断一个数是不是happy number

    题目: Write an algorithm to determine if a number is "happy". A happy number is a number def ...

  7. Singleton模式线程相关的(C\C++)

    这种需求的最新发展. 我需要一个静态类,无论地方,我可以在线程中调用它public功能对应的功能已经完成. 这个静态类会调用我初始化给它的一个指针,这个指针是与线程一一相应的: 准确来说这样的模式应该 ...

  8. iOS 9 新特性

    这篇文章介绍了iOS9开发相关的简介,现在发布的设备都会搭载iOS9.这篇文章也列出了详细描述新特性的文章. iPad多线程增强 iOS9使用Slider Over, Split View, Pict ...

  9. 开源Math.NET基础数学类库使用(08)C#进行数值积分

    原文:[原创]开源Math.NET基础数学类库使用(08)C#进行数值积分               本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4 ...

  10. 作为一个新人,如何学习嵌入式Linux?

    作为一个新人.如何学习嵌入式Linux?我一直在问太多次,特写文章来回答这个问题. 在学习嵌入式Linux之前.肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会).C语言要 ...