网络编程基础一.ppt
《网络编程基础一.ppt》由会员分享,可在线阅读,更多相关《网络编程基础一.ppt(72页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、设计、制作设计、制作:谭献海谭献海Email:2006年9月第1章 网络编程基础网络操作系统(Network Operating System,NOS)是使网络上的计算机能方便而有效地共享网络资源,为网络用户提供所需的各种服务软件和有关规程的集合。它除了具有一般桌面操作系统的全部功能外,还应该满足用户使用网络的需要,尤其要提供数据在网上的安全传输,管理网络中的共享资源,实现用户通信以及方便用户使用网络。网络操作系统是作为网络用户与网络系统之间的接口。网络操作系统的任务有两项:(1)常规任务,主要负责文件管理、存储管理、进程管理、任务管理、I/O管理、CPU调度等;(2)网络任务,主要功能为资源
2、共享(文件、设备、数据)、安全管理、远程过程调用、网络I/O等。目前主流的四种主要网络操作系统是:Windows操作系统:Microsoft公司的Windows系列,如Microsoft的NT 或Windows 2000 Advanced Server等。UNIX或Linux。其中,UNIX操作系统主要有SUN公司的Solaris,IBM公司的AIX等。Linux操作系统主要有Redhat,红旗Linux等。Novell公司的Novell网(NetWare)Santa Cruz Operation公司(SCO)的UnixWare网络操作系统网络操作系统Windows API函数函数nWIN32
3、API是MicrosoftWindows32位平台的应用程序编程接口。WIN32API函数是构筑Windows应用框架的基石,在它的下面是Windows的操作系统核心,上面则是所有的Windows应用程序,如下图所示。Windows API函数函数nWindowsAPI函数分为窗口函数、绘图函数、位图与图标函数、文本和字体函数、设备描述表函数、菜单函数、文件处理函数、Windows消息函数、硬件与系统服务函数、打印函数、网络函数、进程与线程函数。直接使用这些函数是比较复杂的。n目前常用的可视化编程环境(如VB、VC+、DELPHI等)中提供了大量的类库和各种控件,它们替代了API的神秘功能,事
4、实上这些类库和控件都是构架在WIN32API函数基础之上的,是封装了的API函数的集合。它们把常用的API函数组合在一起成为一个控件或类库,并赋予其方便的使用方法,极大地加速了Windows应用程序开发的过程。n实际上如果要开发出更灵活、更实用、更具效率的应用程序,必然要涉及到直接使用API函数,虽然类库和控件使应用程序的开发简单的多,但它们只提供WINDOWS的一般功能,对于比较复杂和特殊的功能来说,使用类库和控件是非常难以实现的,这时就需要采用API函数来实现。Windows API函数函数n附录WindowsAPI函数大全WindowsAPI函数应用实例-利用WindowsAPI函数和注
5、册表获取系统信息nWindows API函数大全函数大全网络函数消息函数文件处理函数打印函数文本和字体函数菜单函数位图、图标和光栅运算函数绘图函数设备场景函数硬件与系统函数进程和线程函数控件与消息函数ByteordernLittleEndiannthelow-orderbyteofthenumberisstoredinmemoryatthelowestaddress,andthehigh-orderbyteatthehighestaddress.(Thelittleendcomesfirst.)nIntelprocessors(thoseusedinPCs)nBigEndiannthehigh
6、-orderbyteofthenumberisstoredinmemoryatthelowestaddress,andthelow-orderbyteatthehighestaddress.(Thebigendcomesfirst.)nMotorolaprocessors(thoseusedinMacs)n4bytesLongInteger0 x99887766Byte3Byte2Byte1Byte099887766nBigEndianBaseAddress+0Byte399BaseAddress+1Byte288BaseAddress+2Byte177BaseAddress+3Byte066
7、nLittleEndianBaseAddress+0Byte066BaseAddress+1Byte177BaseAddress+2Byte288BaseAddress+3Byte399Example一般的PC采用 Little Endian 网络通信采用 Big Endianchannel.sin_addr.s_addr=htonl(INADDR_ANY);channel.sin_port=htons(SERVER_PORT);UtilityroutinesnConvertbetweennetworkbyteorderandthelocalhostsbyteordernhtons(hostt
8、onetworkshort)nntohs(networktohostshort)nhtonl(hosttonetworklong)nntohl(networktohostlong)进程和线程10技术背景n在计算机编程中,一个基本的概念就是同时对多个任务加以控制。如在基于Internet网上的可视电话系统开发中,同时要进行语音采集、语音编解码、图象采集、图象编解码、语音和图象码流的传输,所有的这些事情,都要并行处理。特别是语音信号,如果进行图象编解码时间过长,语音信号得不到服务,通话就有间断,如果图象或语音处理时间过长,而不能及时的传输码流数据,通信同样也会中断。这样就要求我们实现一种并行编程n
9、在只有一个CPU的机器上,也就是要将该CPU时间按照一定的优先准则分配给各个事件,定期处理某一事件而不会在某一事件处理过长n最开始的时候,那些拥有机器低级知识的程序员编写一些“中断服务例程”,主进程的暂停是通过硬件级的中断实现的。尽管这是一种有用的方法,但编出的程序很难移植,由此造成了另一类的代价高昂问题。n目前:多进程/多线程进程n什么是进程?nUnix下的进程nUnix下的多进程编程n进程控制n信号处理n进程间通信什么是进程?几个定义:nAPUE:Anexecutinginstanceofaprogramiscalledaprocess.n不准确:程序一次运行可以创建多个进程n实质上根本不
10、对:在Unix下程序的运行并不产生一个新进程n我的定义:进程是具有独立地址空间的运行单位Unix下的多进程编程1、进程控制2、信号处理3、进程间通信(IPC)进程控制n进程创建fork函数原型:#includepid_tfork(void);UNIX下最优美的函数。pid_t是一个unisignedint,是进程号对应的数据类型fork把子进程ID返回给父进程,把0返回给子进程,通过对返回值的检查就可知道当前是父进程还是子进程。进程创建n一般结构:if(pid=fork()0)parentscode;elseif(pid=0)childscode;elseerrorhandling;n父进程打
11、开的文件描述字将被子进程继承。n获得当前进程id:getpid获得父进程id:getppid函数原型:#includepid_tgetpid(void);pid_tgetppid(void);进程创建执行一个新程序n执行程序系统调用execve函数原型:#includeintexecve(constchar*path,constchar*argv,constchar*envp);Unix还提供其它几个执行程序函数,execl,execlp,execle,execv,execvp都不是系统调用,依赖于execve。执行一个新程序npath,执行的文件nargv,参数表nenvp,环境变量表,一般
12、直接用environ就行如:char*argv=“gcc”,“-g”,“-c”,“rbtree.c”,NULL;execve(“/usr/bin/gcc”,argv,environ);执行一个新程序execve启动一个新的程序,新的地址空间完全覆盖当前进程的地址空间,但当前进程把开的文件描述字(除非特别设置),当前工作目录等将被继承。execve只返回负值表示调用失败,如果成功的话将永不返回。system()()n功能:产生一个新的进程,子进程执行指定的命令。n语法:#includen#includenintsystem(string)nchar*string;n说明:本调用将参数string
13、传递给一个命令解释器(一般为sh)执行,即string被解释为一条命令,由sh执行该命令。若参数string为一个空指针则为检查命令解释器是否存在。n返回值:当参数为空指针时,只有当命令解释器有效时返回值为非零。若参数不为空指针,返回值为该命令的返回状态(同waitpid())的返回值。命令无效或语法错误则返回非零值,所执行的命令被终止.其他情况则返回-1。n例子:charcommand81;ninti;nfor(i=1;i8;i+)nsprintf(command,ps-ttty%02i,i);nsystem(command);n等待进程完成n回收子进程结束状态信息wait,waitpid函
14、数原型:#includepid_twait(int*stat_loc);pid_twaitpid(pid_tpid,int*stat_loc,intoptions);守护进程n在网络编程中,一般服务器程序在接收客户机连接请求之前,都要创建一个守护进程。n守护进程是Linux/Unix編程中一个非常重要的概念,在创建一个守护进程的时候,要接触到子进程、进程组、会晤期、信号机制以及文件、目录、控制终端等多个概念。n仔细阅读教科书中由CarlHarris编写的著名的代理服务器程序(proxy)中的守护进程daemonize()函数:信号处理n信号也称为软中断,是进程通信的一种最古老的方法。n系统用它
15、通知一个或多个进程异步事件的发生n事件的种类包括:程序错误类,程序中止类,闹钟类,I/O类,作业控制类,操作错误类,其它n每个信号都有一个名字,以SIG开头n在/usr/include/asm/signal.h中列出所有的信号名(SIGxxx)。信号处理n当进程接收到一个信号(可能是自己发出,也可能是别的有权限的进程发出),它可以采取的动作可以是下面任意一种:n忽略信号:SIGSTOP与SIGKILL除外。n捕获信号:当信号出现时调用专门提供的一个函数,这个函数称为信号号柄。SIGSTOP与SIGKILL除外。n执行信号的默认动作。几个常见的信号nSIGINT:前台程序执行过程中按下Ctrl-
16、c就会向它发出SIGINT信号,默认动作终止进程。nSIGKILL:立即中止进程,不能被捕获或忽略。nSIGTERM:kill命令默认的中止程序信号。nSIGQUIT:Ctrl-发出的信号,默认动作终止进程并生成core文件。nSIGALRM:定时器到期,可用alarm函数来设置定时器。默认动作终止进程。几个常见的信号nSIGCHLD:子进程终止或停止,默认动作为忽略。nSIGSTOP:停止进程。不可忽略或捕获。nSIGCONT:继续被停止进程。不可忽略。nSIGTSTP:Ctrl-z向程序发出的停止信号。nSIGUSR1、SIGUSR2:程序可利用信号。默认动作终止进程。信号的处理n系统调用
17、signaln用于接受一个指定的信号,并可指定相应的处理方法n在signal.h定义nsignal(int sig,sighandler_t handler)nsig:指定信号类型nhandler:用于处理该信号的函数nSIG_IGN忽略该信号nSIGKILL和SIGSTOP不能忽略nSIG_DFL恢复对该信号的默认处理信号处理默认动作nSIGINTn终止该进程nSIGCHLDn忽略nSIGKILLn终止该进程nSIGSTOPn暂停进程nSIGALRMn终止该进程设置信号动作系统调用n设置定时器alarm,函数原型:#includeunsignedintalarm(unsignedintsec
18、onds);在seconds秒后对本进程发送一个SIGALRM信号。一般情况下返回0;如果已经有一个定时器被设置且还没有到时间,否返回上一个定时器剩余的时间。设置信号动作系统调用npause,sleep#includeintpause(void);intsleep(unsignedintseconds);sleep让进程睡眠seconds秒,pause让进程永远睡眠。如果在睡眠过程中被信号打断,它们将返回-1。信号的发送nkill给进程号为pid的进程发送一个sig信号npid0:发送给进程ID为pid的进程npid=0:发送给与自己同组,并且自己有权限向其发送的进程npid-1:发送给进程组
19、ID为-pid的进程,并且自己有权限向其发送的进程npid=-1:所有自己有权限向其发送信号的进程信号的发送nraise调用给自己发关一个sig信号。因此,raise(sig);等价于kill(getpid(),sig);n发送信号的shell命令:kill。n在默认情况下发送的是SIGTERM信号n$kill12345等价于$killTERM12345,都是向进程12345发送一个SIGTERM信号。n$killKILL12345,向进程12345发送一个SIGKILL信号n管道通信nFIFO(有名管道)通信进程间通信(IPC)管道通信n最古老的UnixIPC工具,一个进程从管道一头写数据,
20、另一个进程从管道另一头读数据。相通信方式是单向的。n创建管道pipe函数原型:#includeintpipe(intfdes1);pipe函数成功后,内核打开两个文件描述字fdes0,fdes1。nfdes1输入端,只能用于写;nfdes0为输出端,只能用于读。n一般文件的I/O函数都可以用于管道,如read、write、close等等。read(fd0,buf,size)Pipe()写端fd1fd0 读端write(fd1,buf,size)int main(void)pid_t pid;int fdes2;if(pipe(fdes)0)perror(“pipe”);exit(1);if(p
21、id=fork()0)/父进程,写父进程,写 close(fdes0);write(fdes1,“Hmmmmmmmmmmm”,12);/*1 2 3 4 5 6 7 8 9 0 1 2*/else /子进程,读子进程,读 char buf4096;ssize_t n;close(fdes1)n=read(fdes0,buf,4096);if(n=0)bufn=0;printf(“%sn”,buf);return 0;管道通信管道破裂n如果一个管道的读端已经关闭,进程还继续向写端写数据,如:pipe(fdes);close(fdes0);write(fdes1,“Letmedie”,10);则进
22、程会收到一个SIGPIPE信号,表示管道破裂。默认动作为结束进程。n读一个写端已经关闭的管道则read返回0。管道的局限性管道的局限性n只支持单向数据流;n只能用于具有亲缘关系的进程之间;n没有名字;n管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);n管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等;FIFO通信nFIFO是一种特殊设备文件,又称为有名管道。操作方法与普通文件相同。n对于普通文件,我们可以从文件任一位置读数据,也可以从任一位置写数据;数据读完不会消失。但对FIFO
23、来说,我们只能从文件头读数据,从文件尾写数据。数据被某进程读走之后就会消失。有名管道的打开有名管道的打开n有名管道比管道多了一个打开操作:open。nFIFO的打开规则是:如果当前打开操作是为读而打开FIFO时,若已经有相应进程为写而打开该FIFO,则当前打开操作将成功返回;否则,可能阻塞直到有相应进程为写而打开该FIFO(当前打开操作设置了阻塞标志);或者,成功返回(当前打开操作没有设置阻塞标志)。n如果当前打开操作是为写而打开FIFO时,如果已经有相应进程为读而打开该FIFO,则当前打开操作将成功返回;否则,可能阻塞直到有相应进程为读而打开该FIFO(当前打开操作设置了阻塞标志);或者,返
24、回ENXIO错误(当前打开操作没有设置阻塞标志)。程序程序:静态的计算机语言编写的代码。:静态的计算机语言编写的代码。进程进程:程序的一次执行。程序代码 程序数据 程序资源线程线程:进程中程序代码的一个执行序列。程序调用堆栈 线程局部变量 可共享访问进程中的数据和资源 操作系统按线程来调度程序的执行多进程多进程:操作系统中多个程序同时执行。多线程多线程:程序中多个片断同时执行。多线程的基本概念图示:线程和进程单进程、单线程如:MS-DOS多进程、每个进程一个线程如:UNIX单进程、多线程如:Java多进程、每个进程多个线程如:Windows2000、Solaris、Linux、Mach和OS/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程 基础
限制150内