linux C 多线程获取字符输入方法

#define READ_BUF_LEN                8

pthread_t lTestThread;


static void *doTestThreadFunc(void *parg)
{
	char acBuf[READ_BUF_LEN];
	char cCounti;
	int nTestData;

	while(1)
	{
		memset(acBuf, 0, READ_BUF_LEN);
		printf("input:");

		fgets(acBuf, READ_BUF_LEN, stdin);
		for(cCounti=0; cCounti<READ_BUF_LEN; cCounti++)
		{
			if(acBuf[cCounti] == '\n')
			{
				acBuf[cCounti] = '\0';
				break;
			}
		}

		printf("-- %s --\n", acBuf);
		nTestData = strtol(acBuf, NULL, 0);
		printf("0x%x \n", nTestData);

		startSettingFunc(nTestData);
	}

	pthread_exit(NULL);
}

容易出错的地方:

1)必须明确使用 fgets 的长度,谨慎使用 strlen() 函数,当没有输入时,strlen() 获取到的长度就为 0,是错的;

2)线程互斥锁只能锁临界资源,不能锁再线程 while(1) 外面,容易导致死锁;




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
内容: 一. Bootloader 二.Kernel引导入口 三.核心数据结构初始化--内核引导第一部分 四.外设初始化--内核引导第二部分 五.init进程和inittab引导指令 六.rc启动脚本 七.getty和login 八.bash 附:XDM方式登录 本文以Redhat 6.0 Linux 2.2.19 for Alpha/AXP为平台,描述了从开机到登录的 Linux 启动全过程。该文对i386平台同样适用。 一. Bootloader 在Alpha/AXP 平台上引导Linux通常有两种方法,一种是由MILO及其他类似的引导程序引导,另一种是由Firmware直接引导。MILO功能与i386平台的LILO相近,但内置有基本的磁盘驱动程序(如IDE、SCSI等),以及常见的文件系统驱动程序(如ext2,iso9660等), firmware有ARC、SRM两种形式,ARC具有类BIOS界面,甚至还有多重引导的设置;而SRM则具有功能强大的命令行界面,用户可以在控制台上使用boot等命令引导系统。ARC有分区(Partition)的概念,因此可以访问到分区的首扇区;而SRM只能将控制转给磁盘的首扇区。两种firmware都可以通过引导MILO来引导Linux,也可以直接引导Linux的引导代码。 “arch/alpha/boot” 下就是制作Linux Bootloader的文件。“head.S”文件提供了对 OSF PAL/1的调用入口,它将被编译后置于引导扇区(ARC的分区首扇区或SRM的磁盘0扇区),得到控制后初始化一些数据结构,再将控制转给“main.c”中的start_kernel(), start_kernel()向控制台输出一些提示,调用pal_init()初始化PAL代码,调用openboot() 打开引导设备(通过读取Firmware环境),调用load()将核心代码加载到START_ADDR(见 “include/asm-alpha/system.h”),再将Firmware中的核心引导参数加载到ZERO_PAGE(0) 中,最后调用runkernel()将控制转给0x100000的kernel,bootloader部分结束。 “arch/alpha/boot/bootp.c”以“main.c”为基础,可代替“main.c”与“head.S” 生成用于BOOTP协议网络引导的Bootloader。 Bootloader中使用的所有“srm_”函数在“arch/alpha/lib/”中定义。 以上这种Boot方式是一种最简单的方式,即不需其他工具就能引导Kernel,前提是按照 Makefile的指导,生成bootimage文件,内含以上提到的bootloader以及vmlinux,然后将 bootimage写入自磁盘引导扇区始的位置中。 当采用MILO这样的引导程序来引导Linux时,不需要上面所说的Bootloader,而只需要 vmlinux或vmlinux.gz,引导程序会主动解压加载内核到0x1000(小内核)或0x100000(大内核),并直接进入内核引导部分,即本文的第二节。 对于I386平台 i386系统中一般都有BIOS做最初的引导工作,那就是将四个主分区表中的第一个可引导 分区的第一个扇区加载到实模式地址0x7c00上,然后将控制转交给它。 在“arch/i386/boot” 目录下,bootsect.S是生成引导扇区的汇编源码,它首先将自己拷贝到0x90000上,然后将紧接其后的setup部分(第二扇区)拷贝到0x90200,将真正的内核代码拷贝到0x100000。以上这些拷贝动作都是以bootsect.S、setup.S以及vmlinux在磁盘上连续存放为前提的,也就是说,我们的bzImage文件或者zImage文件是按照bootsect,setup, vmlinux这样的顺序组织,并存放于始于引导分区的首扇区的连续磁盘扇区之中。 bootsect.S完成加载动作后,就直接跳转到0x90200,这里正是setup.S的程序入口。 setup.S的主要功能就是将系统参数(包括内存、磁盘等,由BIOS返回)拷贝到 0x90000-0x901FF内存中,这个地方正是bootsect.S存放的地方,这时它将被系统参数覆盖。以后这些参数将由保护模式下的代码来读取。 除此之外,setup.S还将video.S中的代码包含进来,检测和设置显示器和显示模式。最 后,setup.S将系统转换到保护模式,并跳转到0x100000(对于bzImage格式的大内核是 0x100000,对于zImage格式的是0x1000)的内核引导代码,Bootloader过程结束。 对于2.4.x版内核 没有什么变化。 二.Kernel引导入口 在arch/alpha/vmlinux.lds 的链接脚本控制下,链接程序将vmlinux的入口置于 "arch/alpha/kernel/head.S"中的__start上,因此当Bootloader跳转到0x100000时, __start处的代码开始执行。__start的代码很简单,只需要设置一下全局变量,然后就跳转到start_kernel去了。start_kernel()是"init/main.c"中的asmlinkage函数,至此,启动过程转入体系结构无关的通用C代码中。 对于I386平台 在i386体系结构中,因为i386本身的问题,在 "arch/alpha/kernel/head.S"中需要更多的设置,但最终也是通过call SYMBOL_NAME(start_kernel)转到start_kernel()这个体系结构无关的函数中去执行了。 所不同的是,在i386系统中,当内核以bzImage的形式压缩,即大内核方式(__BIG_KERNEL__)压缩时就需要预先处理bootsect.S和setup.S,按照大核模式使用$(CPP) 处理生成bbootsect.S和bsetup.S,然后再编译生成相应的.o文件,并使用 "arch/i386/boot/compressed/build.c"生成的build工具,将实际的内核(未压缩的,含 kernel中的head.S代码)与"arch/i386/boot/compressed"下的head.S和misc.c合成到一起,其中的 head.S代替了"arch/i386/kernel/head.S"的位置,由Bootloader引导执行(startup_32入口),然后它调用misc.c中定义的decompress_kernel()函数,使用 "lib/inflate.c"中定义的gunzip()将内核解压到0x100000,再转到其上执行 "arch/i386/kernel/head.S"中的startup_32代码。 对于2.4.x版内核 没有变化。 三.核心数据结构初始化--内核引导第一部分 start_kernel()中调用了一系列初始化函数,以完成kernel本身的设置。 这些动作有的是公共的,有的则是需要配置的才会执行的。 在start_kernel()函数中, 输出Linux版本信息(printk(linux_banner)) 设置与体系结构相关的环境(setup_arch()) 页表结构初始化(paging_init()) 使用"arch/alpha/kernel/entry.S"中的入口点设置系统自陷入口(trap_init()) 使用alpha_mv结构和entry.S入口初始化系统IRQ(init_IRQ()) 核心进程调度器初始化(包括初始化几个缺省的Bottom-half,sched_init()) 时间、定时器初始化(包括读取CMOS时钟、估测主频、初始化定时器中断等,time_init()) 提取并分析核心启动参数(从环境变量中读取参数,设置相应标志位等待处理,(parse_options()) 控制台初始化(为输出信息而先于PCI初始化,console_init()) 剖析器数据结构初始化(prof_buffer和prof_len变量) 核心Cache初始化(描述Cache信息的Cache,kmem_cache_init()) 延迟校准(获得时钟jiffies与CPU主频ticks的延迟,calibrate_delay()) 内存初始化(设置内存上下界和页表项初始值,mem_init()) 创建和设置内部及通用cache("slab_cache",kmem_cache_sizes_init()) 创建uid taskcount SLAB cache("uid_cache",uidcache_init()) 创建文件cache("files_cache",filescache_init()) 创建目录cache("dentry_cache",dcache_init()) 创建与虚存相关的cache("vm_area_struct","mm_struct",vma_init()) 块设备读写缓冲区初始化(同时创建"buffer_head"cache用户加速访问,buffer_init()) 创建页cache(内存页hash表初始化,page_cache_init()) 创建信号队列cache("signal_queue",signals_init()) 初始化内存inode表(inode_init()) 创建内存文件描述符表("filp_cache",file_table_init()) 检查体系结构漏洞(对于alpha,此函数为空,check_bugs()) SMP机器其余CPU(除当前引导CPU)初始化(对于没有配置SMP的内核,此函数为空,smp_init()) 启动init过程(创建第一个核心线程,调用init()函数,原执行序列调用cpu_idle() 等待调度,init()) 至此start_kernel()结束,基本的核心环境已经建立起来了。 对于I386平台 i386平台上的内核启动过程与此基本相同,所不同的主要是实现方式。 对于2.4.x版内核 2.4.x中变化比较大,但基本过程没变,变动的是各个数据结构的具体实现,比如Cache。 四.外设初始化--内核引导第二部分 init()函数作为核心线程,首先锁定内核(仅对SMP机器有效),然后调用 do_basic_setup()完成外设及其驱动程序的加载和初始化。过程如下: 总线初始化(比如pci_init()) 网络初始化(初始化网络数据结构,包括sk_init()、skb_init()和proto_init()三部分,在proto_init()中,将调用protocols结构中包含的所有协议的初始化过程,sock_init()) 创建bdflush核心线程(bdflush()过程常驻核心空间,由核心唤醒来清理被写过的内存缓冲区,当bdflush()由kernel_thread()启动后,它将自己命名为kflushd) 创建kupdate核心线程(kupdate()过程常驻核心空间,由核心按时调度执行,将内存缓冲区中的信息更新到磁盘中,更新的内容包括超级块和inode表) 设置并启动核心调页线程kswapd(为了防止kswapd启动时将版本信息输出到其他信息中间,核心线调用kswapd_setup()设置kswapd运行所要求的环境,然后再创建 kswapd核心线程) 创建事件管理核心线程(start_context_thread()函数启动context_thread()过程,并重命名为keventd) 设备初始化(包括并口parport_init()、字符设备chr_dev_init()、块设备 blk_dev_init()、SCSI设备scsi_dev_init()、网络设备net_dev_init()、磁盘初始化及分区检查等等, device_setup()) 执行文件格式设置(binfmt_setup()) 启动任何使用__initcall标识的函数(方便核心开发者添加启动函数,do_initcalls()) 文件系统初始化(filesystem_setup()) 安装root文件系统(mount_root()) 至此do_basic_setup()函数返回init(),在释放启动内存段(free_initmem())并给内核解锁以后,init()打开 /dev/console设备,重定向stdin、stdout和stderr到控制台,最后,搜索文件系统中的init程序(或者由init=命令行参数指定的程序),并使用 execve()系统调用加载执行init程序。 init()函数到此结束,内核的引导部分也到此结束了,这个由start_kernel()创建的第一个线程已经成为一个用户模式下的进程了。此时系统中存在着六个运行实体: start_kernel()本身所在的执行体,这其实是一个"手工"创建的线程,它在创建了init()线程以后就进入cpu_idle()循环了,它不会在进程(线程)列表中出现 init线程,由start_kernel()创建,当前处于用户态,加载了init程序 kflushd核心线程,由init线程创建,在核心态运行bdflush()函数 kupdate核心线程,由init线程创建,在核心态运行kupdate()函数 kswapd核心线程,由init线程创建,在核心态运行kswapd()函数 keventd核心线程,由init线程创建,在核心态运行context_thread()函数 对于I386平台 基本相同。 对于2.4.x版内核 这一部分的启动过程在2.4.x内核中简化了不少,缺省的独立初始化过程只剩下网络 (sock_init())和创建事件管理核心线程,而其他所需要的初始化都使用__initcall()宏 包含在do_initcalls()函数中启动执行。 五.init进程和inittab引导指令 init进程是系统所有进程的起点,内核在完成核内引导以后,即在本线程(进程)空 间内加载init程序,它的进程号是1。 init程序需要读取/etc/inittab文件作为其行为指针,inittab是以行为单位的描述性(非执行性)文本,每一个指令行都具有以下格式: id:runlevel:action:process其中id为入口标识符,runlevel为运行级别,action为动作代号,process为具体的执行程序。 id一般要求4个字符以内,对于getty或其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。 runlevel 是init所处于的运行级别的标识,一般使用0-6以及S或s。0、1、6运行级别被系统保留,0作为shutdown动作,1作为重启至单用户模式,6 为重启;S和s意义相同,表示单用户模式,且无需inittab文件,因此也不在inittab中出现,实际上,进入单用户模式时,init直接在控制台(/dev/console)上运行/sbin/sulogin。 在一般的系统实现中,都使用了2、3、4、5几个级别,在 Redhat系统中,2表示无NFS支持的多用户模式,3表示完全多用户模式(也是最常用的级别),4保留给用户自定义,5表示XDM图形登录方式。7- 9级别也是可以使用的,传统的Unix系统没有定义这几个级别。runlevel可以是并列的多个值,以匹配多个运行级别,对大多数action来说,仅当runlevel与当前运行级别匹配成功才会执行。 initdefault是一个特殊的action值,用于标识缺省的启动级别;当init由核心激活 以后,它将读取inittab中的initdefault项,取得其中的runlevel,并作为当前的运行级别。如果没有inittab文件,或者其中没有initdefault项,init将在控制台上请求输入 runlevel。 sysinit、 boot、bootwait等action将在系统启动时无条件运行,而忽略其中的runlevel,其余的action(不含initdefault)都与某个runlevel相关。各个action的定义在inittab的man手册中有详细的描述。 在Redhat系统中,一般情况下inittab都会有如下几项: id:3:initdefault: #表示当前缺省运行级别为3--完全多任务模式; si::sysinit:/etc/rc.d/rc.sysinit #启动时自动执行/etc/rc.d/rc.sysinit脚本 l3:3:wait:/etc/rc.d/rc 3 #当运行级别为3时,以3为参数运行/etc/rc.d/rc脚本,init将等待其返回 0:12345:respawn:/sbin/mingetty tty0 #在1-5各个级别上以tty0为参数执行/sbin/mingetty程序,打开tty0终端用于 #用户登录,如果进程退出则再次运行mingetty程序 x:5:respawn:/usr/bin/X11/xdm -nodaemon #在5级别上运行xdm程序,提供xdm图形方式登录界面,并在退出时重新执行. 六.rc启动脚本 上一节已经提到init进程将启动运行rc脚本,这一节将介绍rc脚本具体的工作。 一般情况下,rc启动脚本都位于/etc/rc.d目录下,rc.sysinit中最常见的动作就是激活交换分区,检查磁盘,加载硬件模块,这些动作无论哪个运行级别都是需要优先执行的。仅当rc.sysinit执行完以后init才会执行其他的boot或bootwait动作。 如果没有其他boot、bootwait动作,在运行级别3下,/etc/rc.d/rc将会得到执行,命令行参数为3,即执行 /etc/rc.d/rc3.d/目录下的所有文件。rc3.d下的文件都是指向/etc/rc.d/init.d/目录下各个Shell脚本的符号连接,而这些脚本一般能接受start、stop、restart、status等参数。rc脚本以start参数启动所有以S开头的脚本,在此之前,如果相应的脚本也存在K打头的链接,而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先启动K开头的脚本,以stop 作为参数停止这些已经启动了的服务,然后再重新运行。显然,这样做的直接目的就是当init改变运行级别时,所有相关的服务都将重启,即使是同一个级别。 rc程序执行完毕后,系统环境已经设置好了,下面就该用户登录系统了。 七.getty和login 在rc返回后,init将得到控制,并启动mingetty(见第五节)。mingetty是getty的简化,不能处理串口操作。getty的功能一般包括: 打开终端线,并设置模式 输出登录界面及提示,接受用户名的输入 以该用户名作为login的参数,加载login程序 缺省的登录提示记录在/etc/issue文件中,但每次启动,一般都会由rc.local脚本根据系统环境重新生成。 注:用于远程登录的提示信息位于/etc/issue.net中。 login程序在getty的同一个进程空间中运行,接受getty传来的用户名参数作为登录的用户名。 如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。这通常用来系统维护时防止非root用户登录。 只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。 当用户登录通过了这些检查后,login将搜索/etc/passwd文件(必要时搜索 /etc/shadow文件)用于匹配密码、设置主目录和加载shell。如果没有指定主目录,将默认为根目录;如果没有指定shell,将默认为 /bin/sh。在将控制转交给shell以前, getty将输出/var/log/lastlog中记录的上次登录系统的信息,然后检查用户是否有新邮件(/usr/spool/mail/ {username})。在设置好shell的uid、gid,以及TERM,PATH 等环境变量以后,进程加载shell,login的任务也就完成了。 八.bash 运行级别3下的用户login以后,将启动一个用户指定的shell,以下以/bin/bash为例继续我们的启动过程。 bash 是Bourne Shell的GNU扩展,除了继承了sh的所有特点以外,还增加了很多特性和功能。由login启动的bash是作为一个登录shell启动的,它继承了 getty设置的TERM、PATH等环境变量,其中PATH对于普通用户为"/bin:/usr/bin:/usr/local/bin",对于 root 为"/sbin:/bin:/usr/sbin:/usr/bin"。作为登录shell,它将首先寻找/etc/profile 脚本文件,并执行它;然后如果存在~/.bash_profile,则执行它,否则执行 ~/.bash_login,如果该文件也不存在,则执行~/.profile文件。然后bash将作为一个交互式shell执行~/.bashrc文件(如果存在的话),很多系统中,~/.bashrc都将启动 /etc/bashrc作为系统范围内的配置文件。 当显示出命令行提示符的时候,整个启动过程就结束了。此时的系统,运行着内核,运行着几个核心线程,运行着init进程,运行着一批由rc启动脚本激活的守护进程(如 inetd等),运行着一个bash作为用户的命令解释器。 附:XDM方式登录 如果缺省运行级别设为5,则系统中不光有1-6个getty监听着文本终端,还有启动了一个XDM的图形登录窗口。登录过程和文本方式差不多,也需要提供用户名和口令,XDM 的配置文件缺省为/usr/X11R6/lib/X11/xdm/xdm-config文件,其中指定了 /usr/X11R6/lib/X11/xdm/xsession作为XDM的会话描述脚本。登录成功后,XDM将执行这个脚本以运行一个会话管理器,比如gnome-session等。 除了XDM以外,不同的窗口管理系统(如KDE和GNOME)都提供了一个XDM的替代品,如gdm和kdm,这些程序的功能和XDM都差不多。
第1 章Linux操作系统概述................... .......................................................................... 2 1.1 Linux发展历史........................................................ 2 1.1.1 Linux的诞生和发展.............................................. 2 1.1.2 Linux名称的由来........................................ ........ 3 1.2 Linux的发展要素...................................................... 3 1.2.1 U N I X操作系统.................................................. 4 1.2.2 Minix操作系统.................................................. 4 1.2.3 POSIX 标准.....................................................4 1.3 Linux 与 U N I X 的异同.................................................. 5 1 . 4 操作系统类型选择和内核版本的选择..................................... 5 1.4.1常见的不同公司发行的Linux异同................................. 6 1.4.2 内核版木的选择..................................................6 1.5 Linux的系统架构...................................................... 7 1.5.1 Linux内核的主要模块............................................ 7 1.5.2 Linux的文件结构................................................ 9 1.6 G N U 通用公共许可证..................................................10 1.6.1 G P L许可证的历史.............................................. 10 1.6.2 G P L 的白由理念................................................ 10 1.6.3 G P L 的基本条款................................................ 11 1.6.4关于G P L 许町证的争议......................................... 12 1.7 Linux软件开发的可借鉴之处........................:.................. 12 1-8 .................................................................13 第2 章Linux编程环境....................................................................................................14 2.1 Linux环境下的编辑器................................................. 14 2.1.1 v i m使用简介...................................................14 2 . 1 . 2使用v i m建立文件.............................................. 15 2 . 1 . 3使用v i m编辑文本.............................................. 16 2.1.4 v i m的格式设置.................................................18 目录 2.1.5 vim 配置文件....................................................................................................... .. 2 . 1 . 6 使用其他编辑器................................................................................................... 2.2 Linux下的G C C 编译器工具集.......................................... 19 2.2.1 G C C 简介......................................................19 2 . 2 . 2 编译程序的基本知识......................................................................................... 21 2.2.3 .单个文件编译成执行文件........................................ 22 2 . 2 . 4编译生成目标文件.............................................. 22 2 . 2 . 5多文件编译............ ........................................ 23 2.2.6 预处理........................................................ 24 2 . 2 . 7编译成汇编语言.................................................24 2 . 2 . 8生成和使用静态链接库.......................................... 25 2 . 2 . 9生成动态链接库.................................................26 2.2.10动态加载库................................................... 29 2.2.11 G C C 常用选项................................................ 31 2 . 2 . 1 2编译环境的搭建................................................33 2.3 Makefile 文件简介.....................................................34 2.3.1 一个多文件的工程例子............................. ............. 34 2 . 3 . 2多文件工程的编译.............................................. 36 2.3.3 Makefile 的规则.................................................37 2.3.4 Makefile 中使用变量............................................ 39 2 . 3 . 5搜索路径...................................................... 43 2 . 3 . 6自动推导规则.................................................. 44 2.3.7 递归 make......................................................44 2.3.8 Makefile 中的函数.............................................. 46 2 . 4 用G D B 调试程序..................................................... 47 2 . 4 . 1编译可调试程序.................................................48 2.4.2 使用G D B 调试程序............................................. 49 2.4.3 G D B 常用命令..................................................52 2.4.4 其他的 G D B ....................................................59 2.5 顿.................................................................60 第3 章文件系统简介........................................................ 61 3.1 Linux下的文件系统.................................................. 61 3.1.1 Linux下文件的内涵............................................. 61 3.1.2 文件系统的创建................................................. 62 3 . 1 . 3挂接文件系统.................................................. 64 3.1.4 索弓丨节点 inode.......... •'...................................... 65 3.1.5 普通文件...................................................... 66 3 . 1 . 6设备文件...................................................... 66 3 . 1 . 7虚拟文件系统V F S .............................................. 68 目录 3.2 文件的通用操作方法................................................. 72 3 . 2 . 1文件描述符.................................................... 72 3 . 2 . 2打开创建文件open()、create()函数................................ 72 3 . 2 . 3关闭文件closeO函数............................................ 76 3 . 2 . 4读取文件read()函数............................................. 77 3.2.5 写文件write()函数.............................................. 79 3 . 2 . 6文件偏移lseekO函数............................................ 80 3 . 2 . 7获得文件状态fstat()函数.....................•'................... 83 3 . 2 . 8文件空间映射m m a p ()函数....................................... 85 3 . 2 . 9文件属性fcntl()函数............................................. 88 3. 2 . 1 0文件输入输出控制ioctl()函数....................................92 3.3 socket文件类型....................................................... 93 3.4 /J、@ .................................................................93 第4 章程序、进程和线程.................................................... 94 4 . 1 程序、进程和线程的概念.............................................. 94 4 . 1 . 1程序和进程的差别............................................ ’."94 4.1.2 Linux环境下的进程............................................. 95 4 . 1 . 3进程和线程.................................................... 96 4 . 2 进程产生的方式...................................................... 96 4.2.1 进程号........................................................ 96 4.2.2 进蟬复制 fork()................................................. 97 4.2.3 system()方式....................................................98 4.2.4 进程执行exec()函数系列......................................... 99 4 . 2 . 5所有用户态进程的产生进程init................................. 100 4 . 3 进程间通信和同步................................................... 101 4.3.1 半双工管道................................................... 101 4.3.2 命名管道..................................................... 107 4.3.3 消息队列..................................................... 108 4 . 3 . 4消息队列的一个例子........................................... 114 4.3.5 信号量......................... .............................. 116 4 . 3 . 6共享内存..................................................... 121 4.3.7 信号.......................................................... 124 4.4 Linux下的线程...................................................... 127 4 . 4 . 1多线程编程实例................................................127 4.4.2 Linux线程创建函数 pthread_create()............................ 129 4.4.3 线程的结束函数 pthread_join()和 pthread_exit().....................129 4.4.4 线程的属性................................................... 130 4 . 4 . 5线程间的互斥................................................. 132 4 . 4 . 6线程中使用信号量..............................................133 • VII • n 录 4-5 純............................................................... 136 第2 篇Linux用户层网络编程 第5 章T C P / I P协议族简介.................................................. 138 5.1 O S I网络分层介绍....................................................138 5.1.1 O S I网络分层结构............................................. 138 5.1.2 O S I的7 层网络结构........................................... 139 5.1.3 O S I参考模塑中的数据传输..................................... 140 5.2 TCP/IP 协议找....................................................... 141 5.2.1 TCP/IP协议栈参考模型......................................... 141 5 . 2 . 2主机到网络层协议............................................. 143 5.2.3 IP 协议....................................................... 144 5.2.4 网际控制报文协议(ICMP) .................................... 146 5.2.5 传输控制协议(TCP) ......................................... 150 5 . 2 . 6用户数据报文协议(U D P ) ..................................... 154 5 . 2 . 7地址解析协议(A R P) ......................................... 156 5.3 IP地址分类与T C P / U D P端U .......................................... 158 5 . 3 . 1因特网中IP地址的分类........................................ 159 5.3.2 子网掩码(subnet mask address) ................................ 161 5.3.3 IP地址的配置................................................. 162 5.3.4 端口......................................................... 163 5 . 4 主机字节序和网络字节序............................................. 163 5 . 4 . 1字节序的含义................................................. 164 5 . 4 . 2网络字节序的转换............................................. 164 5.5 /J、@ ........................................................... .....166 第6 章应用层网络服务程序简介...................... ;..................... 167 6.1 H T T P协议和服务....................................................167 6.1.1 H T T P 协议概述.................................................167 6.1.2 H T T P协议的基本过程.......................................... 168 6.2 F T P协议和服务......................................................170 6.2.1 F T P协议概述..................................................170 6.2.2 F T P协议的工作模式........................................... 172 6.2.3 F T P协议的传输方式........................................... 172 6.2.4 —个简单的F T P过程........................................... 173 6.2.5 常用的F T P工具............................................... 173 6.3 T E L N E T协议和服务................................................. 174 6 . 3 . 1远程登录的基本概念........................................... 174 • VIII • 目录 6 . 3 . 2使用T E L N E T协议进行远程登录的工作过程...................... 174 6.3.3 T E L N E T 协议................................................. 174 6.4 N F S 协议和服务......................................................176 6.4.1 安装N F S服务器和客户端...................................... 176 6 . 4 . 2服务器端的设定................................................176 6 . 4 . 3客户端的操作................................................. 177 6.4.4 showmount 命令................................................177 6 . 5 自定义网络服务..................................................... 177 6.5.1 xinetd/inetd....................................................178 6.5.2 xinetd月艮务配置................................................178 6 . 5 . 3自定义网络服务............................................... 179 6.6 小结................................................................180 第7 章T C P 网络编程基础...............................................181 7.1 套接字编程基础知识................................................. 181 7.1.1 套接字地址结构................................................181 7 . 1 . 2用户层和内核层交互过程....................................... 183 7.2 T C P 网络编程流程................................................... 184 7.2.1 T C P网络编程架构............................................. 184 7 . 2 . 2创建网络插口函数socket()...................................... 186 7.2.3 绑定一个地址端口对bind()......................................189 7.2.4 监听本地端口 listen............................................ 192 7.2.5 接受一个网络请求acceptO...................................... 194 7 . 2 . 6连接H 标网络服务器connect()................................... 199 7.2.7 写入数据函数writeO........................................... 200 7 . 2 . 8读取数据函数readO............................................ 201 7 . 2 . 9关闭套接字函数close()......................................... 201 7 . 3 服务器/客户端的简单例子............................................ 202 7.3.1 例子功能描述........................................... ......202 7 . 3 . 2服务器网络程序................................................203 7 . 3 . 3服务器读取和显示字符串....................................... 205 7 . 3 . 4客户端的网络程序............................................. 205 7 . 3 . 5客户端读取和显示字符串....................................... 206 7 . 3 . 6编译运行程序................................................. 206 7 . 4 截取信号的例子..................................................... 207 7.4.1 信号处理..................................................... 207 7.4.2 信号 SIGPIPE..................................................208 7.4.3 信号 SI G INT.................................... •.............. 208 7.5 /J、g ................................................................208 • IX • 第8 章服务器和客户端信息的获取...........................................210 8 . 1 字节序............................................................................................................................210 8 . 1 . 1 大端字节序和小端字节序...............................................................................210 8 . 1 . 2 字节序转换函数................................................................................................212 8.1.3 一个字节序转换的例子......................................... 214 8 . 2 字符串I P地址和二进制IP地址的转换................................. 217 8.2.1 inet_xxx()函数................................................. 217 8.2.2 inet_pton()和 inet_ntop()函数.....................................219 8 . 2 . 3使用8.2.1节地址转换函数的例子............................ .•••••••220 8.2.4 使用函数 inet_pton()和函数 inet—ntop()的例子......................223 8 . 3 套接字描述符判定函数issockettype()................................... 223 8 . 3 . 1进行文件描述符判定的函数issockettypeO.........................224 8.3.2 main()g| 数.................................................... 224 8.4 IP地址与域名之间的相互转换................................................................................. 225 8.4.1 D N S 原理.....................................................225 8 . 4 . 2获取主机信息的函数........................................... 226 8 . 4 . 3使用主机名获取主机信息的例子................................. 228 8 . 4 . 4函数gethostbyname()不可重入的例子............................. 230 8 . 5 协议名称处理函数................................................... 232 8.5.1 xxxprotoxxx()函数............................................. 232 8 . 5 . 2使用协议族函数的例子......................................... 233 8.6 小结................................................................236 第9 章数据的I O和复用....................................................237 9.1 IO 函数.......................................................................................................................... 237 9 . 1 . 1使用recv()函数接收数据........................................237 9 . 1 . 2 使用sendO函数发送数据................................................................................239 9 . 1 . 3 使用readvO函数接收数据..............................................................................240 9 . 1 . 4 使用writev()闲数发送数据.............................................................................240 9 . 1 . 5使用recvmsgO函数接收数据.................................... 242 9 . 1 . 6 使用sendmsgO函数发送数据.........................................................................244 9.1.7 I O函数的比较.................................................246 9.2 使用I O函数的例子.................................................. 246 9 . 2 . 1客户端处理框架的例子......................................... 246 9 . 2 . 2服务器端程序框架............................................. 248 9.2.3 使用 recv()和 send()函数........................................ 249 9.2.4 使用 readv()和 write()函数.......................................251 9.2.5 使用 recvmsgO和 sendmsg()函数..................................253 9.3 10 模型............................................................. 256 9 . 3 . 1阻塞I O模型.................................................. 256 • X • 目录 9 . 3 . 2非阻塞1 0模型................................................ 257 9.3.3 10 复用....................................................... 257 9 . 3 . 4信号驱动I O模型.............................................. 258 9 . 3 . 5异步I O模型.................................................. 258 9.4 select()函数和 pselect()函数............................................ 259 9.4.1 select()闲数.................................................... 259 9.4.2 pselect()函数...................................................261 9.5 poll()函数和 ppoll()函数............................................... 262 9.5.1 poll()函数..................................................... 263 9.5.2 p p o l l O ® ^ .................................................... 264 9 . 6 非阻塞编程.......:.................................................. 264 9 . 6 . 1非阻塞方式程序设计介绍....................................... 264 9 . 6 . 2非阻塞程序设计的例子......................................... 264 9.7 小结................................................................266 第1 0章基于U D P 协议的接收和发送...................................... ,...267 10.1 U D P 编程框架......................................................267 10.1.1 U D P 编程框图................................................ 267 10.1.2 U D P 服务器编程框架.......................................... 269 10.1.3 U D P 客户端编程框架.......................................... 269 10.2 U D P 协议程序设计的常用函数....... :................................270 10.2.1建立套接字socket()和绑定套接字bind()......................... 270 10.2.2 接收数据 recvfrom()/recv()......................................270 10.2.3 发送数据 sendtoO/sendO...............................................................................275 10.3 U D P 接收和发送数据的例子.......................................... 279 10.3.1 U D P 服务器端................................................ 279 10.3.2 U D P 服务器端数据处理........................................280 10.3.3 U D P 客户端..................................................281 10.3.4 U D P 客户端数据处理.......................................... 281 10.3.5 测试 U D P 程序............................................... 282 10.4 U D P 协议程序设计中的几个问题......................................282 10.4.1 U D P 报文丢失数据............................................ 282 10.4.2 U D P 数据发送中的乱序........................................284 10.4.3 U D P 协议中的 connect()函数....................................287 10.4.4 U D P 缺乏流量控制............................................ 287 10.4.5 U D P 协议中的外出网络接口....................................289 10.4.6 U D P 协议中的数据报文截断....................................290 10.5 小结.............................................................. 291 第1 1章高级套接字........................................................ 292 11.1 U N I X 域函数.......................................................292 • XI • 目录 11.1.1 UNIX域函数的地址结构..............................................................................292 1 1 .1 .2套接字函数.................................................................................................... 293 11 . 1 . 3 使用UNIX域函数进行套接字编程............................................................ 293 11.1.4传递文件描述符.............................................. 296 11.1.5 socketpair()闲数............................................................................................. 296 11.1.6传递文件描述符的例子.................................................................................297 11.2 广播............................................................................................................................. 302 11.2.1 广播的IP地址............................................................................................... 302 11.2.2广播与单播的比较......................................................................................... 303 11.2.3 广播的示例.....................................................................................................304 1 1 . 3多播................................................ 11.3.1多播的概念....................... 1 1 .3 .2广域网的多播................... 11.3.3多播的编程....................... 11.3.4 内核中的多播................... 11.3.5 一个多播例子的服务器端 11.3.6 —个多播例子的客户端•••• 1 1 . 4数据链路层访问........................... 11.4.1 SOCK_PACKET 类型…… 11.4.2设置套接U 以捕获链路帧的编程方法............................ 320 11.4.3从套接口读取链路帧的编程方法................................ 321 11.4.4定位IP包头的编程方法....................................... 322 11.4.5定位T C P报头的编程方法..................................... 323 11.4.6定位U D P 报头的编程方法..................................... 325 11.4.7定位应用层报文数据的编程方法................................ 326 11.4.8使用S O C K _ P A C K E T编写A R P 请求程序的例子................. 326 11.5 329 第1 2章套接字选项........................................................330 12.1 获取和设置套接字选项 getsocketopt()/setsocketopt()......................330 12.1.1 getsockopt()函数和 setsocketopt()函数的介绍......................330 12.1.2套接字选项................................ ..................331 12.1.3套接字选项简单示例.......................................... 332 12.2 S O L ^ S O C K E T 协议族选项........................................... 336 12.2.1 S O—B R O A D C A S T 广播选项....................................336 12.2.2 S O—D E B U G 调试选项......................................... 337 12.2.3 S O _ D O N T R O U T E 不经过路由选项............................. 337 12.2.4 S O—E R R O R 错误选项......................................... 338 12.2.5 S O _ K E E P A L I V E 保持连接选项................................. 338 12.2.6 S O L I N G E R缓冲区处理方式选项...............................339 • XII • U录 12.2.7 S O _ O O B I N L I N E带外数据处理方式选项.........................342 12.2.8 S O _ R C V B U F 和 S O一S N D B U F 缓冲区大小选项................... 342 12.2.9 S O _ R C V L O W A T 和 S O _ S N D L O W A T 缓冲区下限选项............ 343 12.2.10 S O _ R C V T I M E O 和 S O _ S N D T I M E O 收发超时选项............... 343 12.2.11 S O _ R E U S E R A D D R 地址重用选项............................. 344 12.2.12 S O—E X C L U S I V E A D D R U S E 端 U 独占选项...................... 344 12.2.13 S 0 _ T Y P E套接字类型选项.................................... 345 12.2.14 SO_BSDCOMPAT 与 BSD 銮接字兼容选项............................................345 12.2.15 S O _ B I N D T O D E V I C E套接字网络接口绑定选项................. 345 12.2.16 S O _ P R I O R I T Y套接字优先级选项............................. 346 12.3 I P P R O T O J P 选项...................................................347 12.3.1 IP-HD RT NCL 选项............................................ 347 12.3.2 IP O P T N I O S 选项............................................ 347 12.3.3 IP_TOS 选项................................................. 347 12.3.4 IP_TTL 选项..................................................347 12.4 IPP RO TO_TCP 选项................................................. 348 12.4.1 T C P _ K E E P A L I V E 选项................... ..................... 348 12.4.2 T C P _ M A X R T 选项............................................ 348 12.4.3 T C P—M A X S E G 选项.......................................... 349 12.4.4 T C P _ N O D E L A Y 和 T C P _ C O R K 选项............................ 349 1 2 . 5使用套接字选项.................................................... 351 12.5.1设置和获取缓冲区大小........................................ 351 12.5.2获取套接字类型的例子........................................ 355 12.5.3使用套接字选项的综合例子.................................... 356 12.6 ioctl()函数.......................................................... 361 12.6.1 ioctl()函数的命令选项......................................... 361 12.6.2 ioctl()函数的 IO 请求.......................................... 363 12.6.3 ioctl()函数的文件请求......................................... 365 12.6.4 ioctl()函数的网络接U 请求:.....................................365 12.6.5使用ioctl()函数对A R P 高速缓存操作........................... 372 12.6.6使用ioct〖()函数发送路由表请求.................................374 12.7 fcntl()函数......................................................... 374 12.7.1 fcntl()函数的选项............................................. 375 12.7.2使用fcntl()函数修改套接字非阻塞属性.......................... 375 12.7.3使用fcntlO函数设置信号属主...................................376 12.8 小结...............................................................376 第13章原始套接字......................................................................................................377 13.1 概述...............................................................377 1 3 . 2原始套接字的创建.................................................. 379 • XIII • 目录 13.2.1 S O C K J I A W 选项............................................. 379 13.2.2 IPJHDR 1NCL 套接字选项......................................379 13.2.3 不需要bindO函数............................................. 380 1 3 . 3原始套接字发送报文................................................ 380 13.4 原始套接字接收报文................................................ 380 1 3 . 5原始套接字报文处理时的结构........................................ 381 13.5.1 1 P头部的结构........................................... ..... 381 13.5.2 I C M P 头部结构............................................... 382 13.5.3 U D P 头部结构................................................ 384 13.5.4 T C P 头部结构................................................ 386 13.6 ping 的例子........................................................ 387 13.6.1 协议格式............................................. •••..... 388 13.6.2 校验和函数.................................................. 389 13.6.3 设置I C M P发送报文的头部.................................... 390 13.6.4剥离I C M P接受报文的头部.................................... 391 13.6.5 计算时间差.................................................. 392 13.6.6发送报文.................................................... 393 13.6.7接收报文.................................................... 394 13.6.8主函数过程.................................................. 395 13.6.9 主函数 main()................................................ 397 13.6.10 编译测试................... ................................ 400 1 3 . 7洪水攻击.......................................................... 400 13.8 I C M P洪水攻击..................................................... 401 13.8.1 I C M P洪水攻击的原理.........................................401 13.8.2 I C M P洪水攻击的例子.........................................401 13.9 U D P 洪水攻市......................................................405 13.10 S Y N 洪水攻击.....................................................409 13.10.1 S Y N 洪水攻击的原理.........................................409 13.10.2 S Y N 洪水攻击的例子.........................................409 13.11 小结............................................................. 413 第1 4章服务器模型选择....................................................414 1 4 . 1循环服务器:........................................................ 414 14.1.1 U D P 循环服务器.............................................. 414 14.1.2 T C P循环服务器.............................................. 417 1 4 . 2简单并发服务器.................................................... 420 14.2.1并发服务器的模型............................................ 420 14.2.2 U D P 并发服务器.............................................. 420 14.2.3 T C P并发服务器.............................................. 423 14.3 T C P的高级并发服务器模型.......................................... 426 . XIV • 目录 14.3.1 单客户端单进程,统一 accept()................................. 426 14.3.2 单客户端单线程,统一accept()................................. 429 1 4.3.3单客户端单线程,各线程独自acceptO,使用互斥锁.............. 431 14.4 I O复用循环服务器..................................................435 14.4.1 I O复用循环服务器模型介绍....................................435 14.4.2 I O复用循环服务器模型的例子..................................436 14.5 440 第1 5章IPv6简介.......................... ...............................441 15.1 IPv4 的缺陷........................................................ 441 15.2 IPv6 的特点........................................................ 442 15.3 IPv6 的地址......................:.................................. 443 15.3.1 IPv6的单播地址.............................................. 443 15.3.2可聚集全球单播地址.......................................... 443 15.3.3 本地使用单播地址............................................ 444 15.3.4 兼容性地址.................................................. 445 15.3.5 IPv6 多播地址................................................ 446 15.3.6 IPv6 任播地址................................................ 446 15.3.7主机的多个IPv6地址......................................... 447 15.4 IPv6 的头部........................................................ 447 15.4.1 IPv6 头部格式........................................ ........ 447 15.4.2 与IPv4头部的对比........................................... 448 15.4.3 IPv6 的 T C P 头部............................................. 449 15.4.4 IPv6 的 U D P 头部............................................. 449 15.4.5 IPv6 的 I C M P 头部............................................ 449 15.5 IPv6运行环境...................................................... 451 15.5.1 加载 IPv6 模块............................................... 451 15.5.2查看是否支持IPv6............................................ 452 15.6 IPv6的结构定义.................................................... 453 15.6.1 IPv6的地址族和协议族........................................453 15.6.2套接字地址结构...............................................453 15.6.3 地址兼容考虑................................................ 455 15.6.4 IPv6 通用地址................................................ 455 15.7 IPv6的套接字函数.................................................. 456 15.7.1 socketO 函数.................................................. 456 15.7.2没有发生改变的函数.......................................... 456 15.7.3 发生改变的函数...............................................457 15.8 IPv6的套接字选项.................................................. 457 15.8.1 IPv6的套接字选项............................................ 457 15.8.2 单播跳限 I P V 6 _ U N I C A S T _ H O P S............................... 459 • XV • 目录 15.8.3发送和接收多播包............................................ 459 15.8.4 IPv6中获得时间戳的ioctl命令................................. 460 15.9 IPv6的库函数...................................................... 460 15.9.1地址转换函数的差异.......................................... 460 15.9.2域名解析函数的差异.......................................... 461 15.9.3 测试宏...................................................... 463 15.10 IPv6的编程的一个简单例子......................................... 463 15.10.1 服务器程序................................................. 464 15.10.2 客户端程序................................................. 465 15.10.3 编译调试................................................... 467 15.11 小结............................................................. 467 第3 篇Linux内核网络编程 第16章Linux内核中网络部分结构以及分布...............................................................470 16.1 概述...............................................................470 16.1.1代码目录分布................................................ 470 16.1.2内核中网络部分流程简介...................................... 472 16.1.3系统提供修改网络流程点...................................... 474 16.1.4 sk_buff 结构..................................................475 16.1.5 网络协议数据结构inet_protosw................................. 478 1 6 . 2软中断C P U 报文队列及其处理....................................... 479 16.2.1 Linux内核网络协议层的层间传递手段— 软中断................ 479 1 6 . 2 . 2网络收发处理软中断的实现机制................................ 481 16.3 socket数据如何在内核中接收和发送...................................482 16.3.1 socket()的初始化.............................................. 482 16.3.2 接收网络数据recv()........................................... 482 16.3.3发送网络数据sendO........................................... 483 16.4 小结...............................................................484 第17章neffilter框架内报文处理.................................................................................485 17.1 netfilter............................................................ 485 17.1.1 netfilter 简介..................................................485 17.1.2 netfilter 框架..................................................486 17.1.3 netfilter 检査时的表格.........;................................487 17.1.4 netfilter 的规则................................................487 17.2 iptables 和 netfilter...................................................488 17.2.1 iptables 简介..................................................488 17.2.2 iptables 的表和链............................................. 488 • XVI • 目录 17.2.3 使用iptables设置过滤规则.....................................489 1 7 . 3内核模块编程...................................................... 492 17.3.1 内核 “Hello, World! ”程序................................... 492 17 . 3 . 2内核模块的基本架构.......................................... 494 1 7 . 3 . 3内核模块加载和卸载过程...................................... 496 1 7 . 3 . 4内核模块初始化和清理函数.................................... 497 1 7 . 3 . 5内核模块初始化和淸理过程的容错处理.......................... 497 1 7 . 3 . 6内核模块编译所需的Makefile.................................. 498 17.4 5 个钩子点......................................................... 499 17.4.1 netfilter 的 5 个钩子,点......................................... 499 17.4.2 N F H O O K 'k .................................................500 17.4.3钩了.的处理规则.............................................. 501 1 7 . 5注册/注销钩子...................................................... 502 17.5.1 结构 nf_hook_ops............................................. 502 17.5.2注册钩子.................................................... 503 17.5.3 注销钩子.................................................... 504 17.5.4注册注销函数................................................ 504 1 7 . 6钩子的简单处理例子................................................ 505 17.6.1 功能描述.................................................... 505 17.6.2 需求分析.................................................... 506 17.6.3 ping回显屏蔽实现............................................ 506 17.6.4禁止向目的IP地址发送数据的实现............................. 506 17.6.5 端口关闭实现................................................ 506 17.6.6动态配置实现................................................ 508 17.6.7可加载内核实现代码.......................................... 509 17.6.8应用层测试代码实现.......................................... 516 17.6.9 编泽运行.................................................... 516 17.7 •点多个钩子的优先级...............................................517 1 7 . 8校验和问题........................................................ 518 17.9 小结.... ...........................................................518 第4篇综合案例 第1 8章一个简单W e b 服务器的例子S H T T P D ............................... 522 18.1 S H T T P D的需求分析................................................ 522 18.1.1 S H T T P D启动参数可动态配置的需求............................ 523 18.1.2 S H T T P D的多客户端支持的需求................................ 524 18.1.3 S H T T P D支持方法的需求...................................... 525 18.1.4 S H T T P D支持的H T T P协议版本的需求.......................... 526 • XVII • 0 录 18.1.5 S H T T P D支持头部的需求...................................... 527 18.1.6 S H T T P D 定位 URI 的需求......................................527 18.1.7 S H T T P D 支持 CGI 的需求......................................528 18.1.8 S H T T P D错误代码的需求............... ....................... 529 18.2 S H T T P D的模块分析和设计.......................................... 530 18.2.1 S H T T P D 的主函数............................................ 530 18.2.2 S H T T P D命令行解析的分析设计................................ 531 18.2.3 S H T T P D配置文件解析的分析设计.............................. 532 18.2.4 S H T T P D的多客户端支持的分析设计............................ 534 18.2.5 S H T T P D头部解析的分析设计.................................. 536 18.2.6 S H T T P D 对 URI 的分析设计....................................537 18.2.7 S H T T P D支持方法的分析设计.................................. 537 18.2.8 S H T T P D支持C G I的分析设计................................. 538 18.2.9 S H T T P D错误处理的分析设计................................. <540 18.3 S H T T P D各模块的实现.................................... :......... 542 18.3.1 S H T T P D命令行解析的实现.................................... 543 18.3.2 S H T T P D文件配置解析的实现.................................. 545 18.3.3 S H T T P D的多客户端支持的实现................................ 547 18.3.4 S H T T P D所请求U R I解析的实现............................... 551 18.3.5 S H T T P D方法解析的实现...................................... 552 18.3.6 S H T T P D响应方法的实现...................................... 552 18.3.7 S H T T P D 支持 CGI 的实现......................................556 18.3.8 S H T T P D支持H T T P协议版本的实现............................ 559 18.3.9 S H T T P D内容类型的实现...................................... 559 18.3.10 S H T T P D错误处理的实现..................................... 561 18.3.11 S H T T P D生成目录下文件列表文件的实现.......................563 18.3.12 S H T T P D主函数的实现....................................... 565 18.4 S H T T P D的编译、调试和测试........................................ 566 18.4.1 建立源文件...................................................566 18.4.2 制作 Makefile.................................................566 18.4.3 制作执行文件........................................:....... 567 18.4.4使用不同的浏览器测试服务器程序.............................. 567 18.5 小结...............................................................568 第1 9章一个简单网络协议栈的例子S I P ......................................569 19.1 S I P网络协议找的功能描述........................................... 569 19.1.1 SIP网络协议栈的基本功能描述................................ 570 19.1.2 S I P网络协议栈的分层功能描述................................ 570 19.1.3 S I P网络协议栈的用户接U 功能描述............................ 571 19.2 S I P网络协议找的架构............................................... 571 • XVIII • S 录 19.3 S I P网络协议找的存储区缓存......................................... 572 19.3.1 SIP存储缓冲的结构定义....................................... 573 19.3.2 SIP存储缓冲的处理函数....................................... 577 19.4 S I P网络协议找的网络接U 层......................................... 579 19.4.1 SI P网络接U 层的架构......................................... 579 19.4.2 S I P网络接U 层的数据结构...................................•.••■580 19.4.3 S I P网络接口层的初始化函数...................................581 19.4.4 S I P网络接口层的输入函数.....................................583 19.4.5 S I P网络接口层的输出函数.....................................586 19.5 S I P网络协议栈的A R P 层............................................ 588 19.5.1 SIP地址解析层的架构......................................... 588 19.5.2 SIP地址解析层的数据结构.....................................588 19.5.3 SIP地址解析层的映射表.......................................590 19.5.4 SIP地址解析层的A R P 映射表维护函数......................... 591 19.5.5 SIP地址解析层的A R P 网络报文构建函数.... :..................593 19.5.6 S1P地址解析层的A R P 网络报文收发处理函数................... 595 19.6 S I P网络协议栈的IP层.............................................. 598 19.6.1 S I P网际协议层的架构......................................... 598 19.6.2 S I P网际协议层的数据结构.....................................599 19.6.3 S I P网际协议层的输入函数.....................................601 19.6.4 S I P网际协议层的输出函数.....................................605 19.6.5 S I P网际协议层的分片函数.....................................606 19.6.6 S I P网际协议层的分片组装函数................................ 607 19.7 S I P网络协议栈的I C M P层........................................... 611 19.7.1 SIP控制报文协议的数据结构.................................. 611 19.7.2 SIP控制报文协议的协议支持...................................612 19.7.3 SIP控制报文协议的输入函数.................................. 613 19.7.4 SIP控制报文协议的回显应答函数.............................. 614 19.8 S I P网络协议栈的U D P 层............................................ 615 19.8.1 SIP数据报文层的数据结构.....................................615 19.8.2 SIP数据报文层的控制单元.....................................615 19.8.3 SIP数据报文层的输入函数.....................................617 19.8.4 SIP数据报文层的输出函数.....................................618 19.8.5 SIP数据报文层的建立函数.....................................618 19.8.6 SIP数据报文层的释放函数.....................................619 19.8.7 SIP数据报文层的绑定函数.....................................620 19.8.8 SIP数据报文层的发送数据闲数.................................621 19.8.9 SIP数据报文层的校验和计算...................................622 19.9 S I P网络协议栈的协议无关层......................................... 623 19.9.1 SIP协议无关层的系统架构.....................................623 • XIX • 目录 19.9.2 SIP协议无关层的函数形式.....................................624 19.9.3 S1P协议无关层的接收数据函数................................ 624 19.10 S I P网络协议栈的B S D 接U 层....................................... 625 19.10.1 S IP用户接口层的架构........................................ 625 19.10.2 SIP用户接n 层的套接字建立函数............................. 626 19.10.3 SIP用户接M 层的套接字关闭函数............................. 627 19.10.4 SIP用户接U 层的套接字绑定函数............................. 627 19.10.5 SIP用户接丨」层的套接字连接函数............................. 628 19.10.6 SIP用户接U 层的套接字接收数据函数......................... 628 19.10.7 SIP用户接口层的发送数据函数................................629 19.11 S I P网络协议找的编译.............................................. 630 19.11.1 SI P的文件结构.............................................. 630 19.11.2 SIP 的 Makefile.............................................. 631 19.11.3 SIP的编译运行.............................................. 631 19.12 小结..............................................................631 第2 0章一个简单防火墙的例子S I P F W .......................................633 20.1 S I P F W防火墙的功能描述............................................ 633 20.1.1 S I P F W防火墙对主机进行网络数据过滤的功能描述............... 633 20.1.2 S I P F W防火墙用户设置防火墙规则的功能描述................... 634 20.1.3 S I P F W防火墙配K 文件等附加功能的功能描述................... 634 20.2 SIPFW 需求分析.................................................... 634 20.2.1 S I P F W防火墙条件和动作......................................635 20.2.2 S I P F W防火墙支持过滤的类型和内容........................... 635 20.2.3 S I P F W防火墙过滤的方式和动作............................... 638 20.2.4 S I P F W防火墙的配置文件...................................... 640 20.2.5 S I P F W防火墙命令行配置格式..................................640 20.2.6 S I P F W防火墙的规则文件格式..................................642 20.2.7 S I P F W防火墙的日志文件数据格式............................. 643 20.2.8 S I P F W防火墙构建所采用的技术方案........................... 644 2 0 . 3使用netlink进行用户空间和内核空间数据交S ......................... 645 20.3.1 netlink的用户空间程序设计.................................... 645 20.3.2 netlink 的内核空间 A P I........................................ 648 2 0 . 4使用proc进行内存数据用户空间映射..................................650 20.4.1 proc虚拟文件系统的结构...................................... 650 20.4.2 创建proc虚拟文件........................................... 651 2 0 . 4 . 3删除proc虚拟文件........................................... 652 20.4.4 proc文件的写函数............................................ 652 20.4.5 proc文件的读函数............................................ 653 2 0 . 5内核空间的文件操作函数............................................ 654 • XX • 20.5.1 内核空间的文件结构.......................................... 654 20.5.2 内核空间的文件建立操作...................................... 655 20.5.3 内核空间的文件读写操作...................................... 656 20.5.4 内核空间的文件关闭操作...................................... 657 20.6 S I P F W防火墙的模块分析和设计......................................657 20.6.1 S I P F W防火墙的总体架构...................................... 657 20.6.2 S I P F W防火墙的用户命令解析................................. 660 20.6.3 S I P F W用户空间与内核空间的交互............................. 663 20.6.4 S I P F W防火墙内核链h 的规则处理............................. 666 20.6.5 S I P F W防火墙的P R O C 虑拟文件系统........................... 668 20.6.6 S I P F W防火墙的配置文件和口志文件处理....................... 669 20.6.7 S I P F W防火墙的过滤模块设计................................. 671 20.7 S I P F W防火墙各功能模块的实现......................................673 20.7.〗 S I P F W防火墙的命令解析代码................................. 674 20.7.2 S I P F W防火墙的过滤规则解析模块代码......................... 678 20.7.3 S I P F W防火墙的网络数据拦截模块代码......................... 680 20.7.4 S I P F W防火墙的P R O C 虚拟文件系统........................... 681 20.7.5 S I P F W防火墙对配置文件的解析............................... 683 20.7.6 S I P F W防火墙内核模块初始化和退出........................... 684 2 0 . 7 . 7用户空间处理主函数.......................................... 685 20.8 编译、调试和测试.......................... ....................... 686 2 0 . 8 . 1用户程序和内核程序的Makefile................................ 686 20.8.2 编译及运行.................................................. 687 2 0 . 8 . 3下发过滤规则,测试过滤结果.................................. 688 20.9 小结.............................................................. 690

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fttony2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值