1、main.c

        int main(int argc, char *argv[], char *env[]):首先是读取配置文件信息,把vtun进程设置为守护进程,判断主机是服务器还是终端,若是服务器则调用server.c文件中的server(sock)函数。若是终端则调用cient.c文件中的client(host)函数。

2、server.c

        void server(int sock)函数:先判断server type,如果是独立服务器(VTUN_STAND_ALONE),则调用listener()函数,把server设置成处于监听状态;如果是VTUN_INETD,则直接调用connection()函数,在服务器与终端之间建立连接。

        void listener(void):先利用tcp协议在服务器端建立一个套接字,绑定该套接字的ip地址和端口,把该套接字设置成处于循环监听状态,accept来自终端的socket,这样把server端的socket就一直处于监听状态。接下来,如果fork()成功,则调用connection()函数,建立服务器与终端之间的连接。

        void connection(int sock)函数:先获取与服务器建立连接的终端的地址信息,然后调用auth_server(sock)函数进行再服务器上认证,若认证成功,则记录建立连接的终端的主机名、ip、和端口号,然后调用tunnal(host)函数打开服务器与上述终端之间的隧道。完成服务器与终端之间的连接的建立。

3、auth.c

        struct vtun_host * auth_server(int fd)函数:在server端完成对终端的认证,具体内容还没看完,里面涉及到的write()函数是把vtun server版本信息发送给终端,...................................................

        char *cl2cs(char *chal)函数:把加密数据由二进制转换成字符串。

        void gen_chal(char *buf)函数:生成挑战,存入buf中。

        int cs2cl(char *str, char *chal)函数:把str指向的字符串转换成二进制存入chal中。

4、lib.c

        void set_title(const char *fmt, ...)函数:函数的功能是:把fmt指向的字符串复制到title_start所标示的地址中。(tittle_start望文生义)。        此函数有不定个参数,所以要了解一下c语言是如何处理不定参数的。在stdarg.h中有以下几个宏定义:(下面内容转载)下面是 <stdarg.h> 里面重要的几个宏定义如下:
typedef char* va_list;
void va_start ( va_list ap, prev_param ); /* ANSI version */
type va_arg ( va_list ap, type );
void va_end ( va_list ap );
va_list 是一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行。
<Step 1> 在调用参数表之前,定义一个 va_list 类型的变量,(假设va_list 类型变量被定义为ap);
<Step 2> 然后应该对ap 进行初始化,让它指向可变参数表里面的第一个参数,这是通过 va_start 来实现的,第一个参数是 ap 本身,第二个参数是在变参表前面紧挨着的一个变量,即“...”之前的那个参数;
<Step 3> 然后是获取参数,调用va_arg,它的第一个参数是ap,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把 ap 的位置指向变参表的下一个变量位置;
<Step 4> 获取所有的参数之后,我们有必要将这个 ap 指针关掉,以免发生危险,方法是调用 va_end,他是输入的参数 ap 置为 NULL,应该养成获取完参数表之后关闭指针的习惯。

        int print_p(int fd,const char *fmt, ...)函数:通过write()向终端发送vtun server版本信息。调用了系统函数vsnprintf()和函数write_n()。

        int readn_t(int fd, void *buf, size_t count, time_t timeout) 函数:在时间timeout内通过套接字fd读取count个字节,存入buf中。

5、tunnel.c

        int tunnel(struct vtun_host *host)函数:形参指向的是终端host的信息。