《第1章 网络编程基础.ppt》由会员分享,可在线阅读,更多相关《第1章 网络编程基础.ppt(73页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、网络编程网络编程第一章第一章 网络编程基础网络编程基础网络编程网络编程常州大学信息学院常州大学信息学院内容内容1网络操作系统网络操作系统 2文件系统文件系统3I/O模型模型 4套接字与管道套接字与管道5进程与线程进程与线程6信号信号7应用程序与设备驱动程序之间应用程序与设备驱动程序之间的接口的接口8字节顺序字节顺序2网络编程网络编程常州大学信息学院常州大学信息学院一、一、网络操作系统网络操作系统 网络操作系统的网络操作系统的概念概念 网络操作系统(Network Operating System,NOS)是使网络上的计算机能方便而有效地共享网络资源,为网络用户提供所需的各种服务软件和有关规程的
2、集合。3网络编程网络编程常州大学信息学院常州大学信息学院网络操作系统的网络操作系统的任务任务常规任务网络任务4网络编程网络编程常州大学信息学院常州大学信息学院主流主流的网络操作系统的网络操作系统Windows系列UNIX或LinuxNetwareUnixWare5网络编程网络编程常州大学信息学院常州大学信息学院1、Unix UNIX是一个多用户、多任务的分时操作系统,UNIX系统主要由内核、外壳、文件系统、命令4个部分组成。UNIX中包含3个主要的网络包:TCP/IP 基本网络实用程序(BNU)网络文件系统(Network File System,NFS)6网络编程网络编程常州大学信息学院常州
3、大学信息学院2、Linux Linux是按照UNIX风格设计的操作系统,所以在源代码级上兼容绝大部分的UNIX标准。但Linux也有自身的特点:源代码开放提供GUI支持大量外部设备和32种文件系统内置通信联网功能,可让异种机联网支持并行处理和实时处理在Linux平台上软件开发成本低7网络编程网络编程常州大学信息学院常州大学信息学院3、Windows系列 Windows操作系统在整个局域网配置中是最常见的,但由于它对服务器的硬件要求较高,且稳定性能不是很高,所以Windows网络操作系统一般只是用在中低档服务器中,高端服务器通常采用UNIX、Linux或Solaris等非Windows操作系统。
4、在局域网中,Windows网络操作系统主要有:Windows NT 4.0 Server、Windows 2000 Server/Advance Server,以及最新的Windows 2003 Server/Advance Server等。8网络编程网络编程常州大学信息学院常州大学信息学院二、二、文件系统文件系统 基本文件操作基本文件操作 1、文件的打开和关闭 当需要打开一个文件进行读写操作的时候,可以使用系统调用函数open。文件使用完以后调用另外一个函数close进行关闭操作。9网络编程网络编程常州大学信息学院常州大学信息学院2、创建新文件 要创建一个新的文件,可以使用creat函数。3
5、、文件的读写 文件打开以后,就可以对文件进行读写了。可以调用函数read和write进行文件的读写。10网络编程网络编程常州大学信息学院常州大学信息学院文件属性文件属性 文件具有各种各样的属性,除了文件权限以外,文件还有创建时间、大小等属性。要判断文件是否可以进行某种操作(读、写等),就可以使用access函数。如果要获得文件的其他属性,可以使用stat或者fstat函数。11#include#include#includemain()struct stat buf;int fd;fd=open(“/etc/passwd”,O_RDONLY);fstat(fd,&buf);printf(“/e
6、tc/passwd file size=%dn“,buf.st_size);执行结果:/etc/passwd file size=70512网络编程网络编程常州大学信息学院常州大学信息学院目录文件目录文件 在编写程序时,有时要获取当前的工作路径。C库函数提供了getcwd来解决这个问题。Linux提供了大量的目录操作函数,其中比较简单和常用的函数有:mkdir、opendir、readdir、closedir、telldir和seekdir。13网络编程网络编程常州大学信息学院常州大学信息学院#includemain()char buf80;getcwd(buf,sizeof(buf);pri
7、ntf(“current working directory:%sn”,buf);执行结果:current working directory:/tmp14网络编程网络编程常州大学信息学院常州大学信息学院文件加锁文件加锁 对一个文件,一个时刻只能进行一个写操作,所以在写的同时,要对文件加锁,防止别的用户也进行写操作。一般对要写的文件进行锁定用flock函数。15网络编程网络编程常州大学信息学院常州大学信息学院三、三、I/O模型模型 在通信过程中,必须明确所采用的I/O方式。在WinSock等通信中,常用的通信方式分为阻塞和非阻塞方式,其中非阻塞方式又包括Select(选择)、WSAAsyncS
8、elect(异步选择)、WSAEventSelect(事件选择)、Overlapped I/O(重叠式I/O)和Completion Port(完成端口)等。16网络编程网络编程常州大学信息学院常州大学信息学院四、四、套接字与管道套接字与管道 Socket Socket是进程间通信的BSD(Berkeley Software Distribution,伯克利软件套件,是指Unix的衍生系统)方法。定义:一个本地主机建立或拥有的应用进程,在操作系统控制下,与其它(远程)应用进程之间发送和接收数据的接口。17网络编程网络编程常州大学信息学院常州大学信息学院管道管道 1、管道概述 管道是UNIX/L
9、inux系统中进程间通信形式之一,采用半双工方式。read(fd0,buf,size)Pipe()写端fd1读端fd0write(fd1,buf,size)18网络编程网络编程常州大学信息学院常州大学信息学院2、管道的创建#include int pipe(int fd2);说明:fd0为管道的读取端,fd1则为管道的写入端。返回值:若成功则返回零,否则返回-1。3、管道的读写 实例:父进程借管道将字符串“hello!n”传给子进程并显示。19#include main()int filedes2;char buffer80;pipe(filedes);if(fork()0)/*父进程*/ch
10、ar s =“hello!n”;write(filedes1,s,sizeof(s);else /*子进程*/read(filedes0,buffer,80);printf(“%s”,buffer);执行结果:hello!20网络编程网络编程常州大学信息学院常州大学信息学院4、管道的局限性只支持单向数据流;没有名字,只能用于具有亲缘关系的进程之间;管道的缓冲区是有限的;管道所传送的是无格式字节流。21网络编程网络编程常州大学信息学院常州大学信息学院有名管道有名管道 1、FIFO通信 FIFO是一种特殊设备文件,又称为有名管道。操作方法与普通文件相同。对于普通文件,可以从文件任一位置读数据,也可
11、以从任一位置写数据;数据读完不会消失。但对FIFO来说,只能从文件头读数据,从文件尾写数据。数据被某进程读走之后就会消失。22网络编程网络编程常州大学信息学院常州大学信息学院2、有名管道的创建#include#include int mkfifo(const char *pathname,mode_t mode);说明:mkfifo()会依参数pathname建立特殊的FIFO文件,该文件必须不存在,而参数mode与open()函数中的mode参数相同。23网络编程网络编程常州大学信息学院常州大学信息学院3、有名管道的打开 有名管道比管道多了一个打开操作:open。FIFO的打开规则包括为读而
12、打开FIFO和为写而打开FIFO两方面。4、有名管道的读写从FIFO中读取数据向FIFO中写入数据24#include#includemain()char buffer80;int fd;mkfifo(FIFO,10606);if(fork()0)char s =“hello!n”;fd=open(FIFO,O_WRONLY);write(fd,s,sizeof(s);close(fd);else fd=open(FIFO,O_RDONLY);read(fd,buffer,80);printf(“%s”,buffer);close(fd);执行结果:hello!25网络编程网络编程常州大学信息
13、学院常州大学信息学院五、进程与线程五、进程与线程 进程进程 1、进程的定义 An executing instance of a program is called a process.26网络编程网络编程常州大学信息学院常州大学信息学院2、进程的基本模型 进程在运行过程中存在着三种主要状态。就绪状态运行状态阻塞状态27网络编程网络编程常州大学信息学院常州大学信息学院3、进程控制块 系统为了管理进程而设置的一个专门的数据结构,它反映了进程的动态特征,进程存在的唯一标志。4、进程的同步与互斥 进程同步:多个合作进程为了完成同一个任务,在执行上相互依赖。进程互斥:多个进程使用某一共享资源,任何时刻
14、最多只允许一个进程去使用,其他进程要等到该资源释放才可使用。28网络编程网络编程常州大学信息学院常州大学信息学院UNIX/Linux多进程编程的系统调用多进程编程的系统调用 1、fork()#include#include pid_t fork();说明:产生一个新的子进程。pid_t是一个unsigned int。返回值:调用成功则对子进程返回0,对父进程返回子进程号,通过返回值可以区分父子进程。调用失败返回-1给父进程,不生成子进程。29网络编程网络编程常州大学信息学院常州大学信息学院2、system()#include#include int system(char*string);说明
15、:system()会调用fork()产生子进程。由子进程调用命令解释器来执行参数string字符串所代表的命令,执行完返回原进程。返回值:=-1:出现错误 =0:调用成功但是没有出现子进程 0:成功退出的子进程的id30网络编程网络编程常州大学信息学院常州大学信息学院3、exec()#include int execl(char*path,char*arg,.);说明:用来执行参数path字符串所代表的文件或命令,参数arg代表执行该文件时传递过去的参数,最后一个参数必须用空指针(NULL)作结束。返回值:执行成功则函数不会返回,执行失败则直接返回-1。31网络编程网络编程常州大学信息学院常州
16、大学信息学院#include int execv(char*path,char*argv);说明:用来执行参数path字符串所代表的文件,第二个参数利用数组指针来传递给执行文件。返回值:同execl函数。32网络编程网络编程常州大学信息学院常州大学信息学院#include int execle(char*path,char*arg,.,char*envp);说明:用来执行参数path字符串所代表的文件,参数arg代表执行该文件时传递过去的参数,最后一个参数必须用空指针(NULL)作结束。参数envp则为传递给执行文件的新环境变量数组。返回值:同execl函数。33网络编程网络编程常州大学信息学
17、院常州大学信息学院#include int execve(char*path,char*argv,char*envp);说明:用来执行参数path字符串所代表的文件,第二个参数利用数组指针来传递给执行文件,最后一个参数则为传递给执行文件的新环境变量数组。返回值:同execl函数。34网络编程网络编程常州大学信息学院常州大学信息学院#include int execvp(char*file,char*argv);说明:execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。返回值:同execl函数。35网络
18、编程网络编程常州大学信息学院常州大学信息学院#includemain()char*argv=“ls”,“-al”,“/etc/passwd”,NULL;char*envp=“PATH=/bin”,0 execve(“/bin/ls”,argv,envp);执行结果:-rw-r-r-1 root root 705 Sep 3 13:52/etc/passwd36网络编程网络编程常州大学信息学院常州大学信息学院4、popen()#include FILE*popen(char*command,char type);说明:在调用进程和执行命令间创建一个管道。参数command是被执行的命令行。参数t
19、ype可使用“r”代表读取,“w”代表写入。返回值:若成功则返回文件指针,否则返回NULL。37网络编程网络编程常州大学信息学院常州大学信息学院5、pclose()#include int pclose(FILE*stream);说明:关闭由popen所建立的管道及文件指针。参数stream为先前由popen()所返回的文件指针。返回值:返回进程的结束状态,如果有错误则返回-1。38网络编程网络编程常州大学信息学院常州大学信息学院6、wait()#include#include pid_t wait(int*status);说明:调用进程取得子进程的状态信息,然后挂起直到一个子进程结束。子进程
20、的结束状态值会由参数status 返回。如果不在意结束状态值,则参数 status可以设成NULL。返回值:执行成功则返回子进程号,否则返回-1。39网络编程网络编程常州大学信息学院常州大学信息学院7、waitpid()#include#include pid_t waitpid(pid_t pid,int*status,int options);说明:系统调用行为由参数pid和options决定。返回值:执行成功则返回子进程号,否则返回-1。40网络编程网络编程常州大学信息学院常州大学信息学院8、setpgrp()#include int setpgrp(void);说明:将当前进程所属的组
21、号设为当前进程的进程号。返回值:执行成功则返回新的进程组号,否则返回-1。41网络编程网络编程常州大学信息学院常州大学信息学院9、exit()#include void exit(int status);说明:用来终结目前进程的执行,并把进程所有的缓冲区数据自动写回,同时关闭未关闭的文件。42网络编程网络编程常州大学信息学院常州大学信息学院10、signal()#include void(*signal(int signum,void(*disp)(int)(int);说明:按参数signum指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数disp指定的函数执行。返回值:
22、返回先前的信号处理函数指针,否则返回SIG_ERR。43#includevoid catch_sign()printf(catch signal!n);main(void)signal(SIGINT,catch_sign);printf(hello!n);sleep(10);printf(hello!n);执行结果:hello!catch signal!hello!44网络编程网络编程常州大学信息学院常州大学信息学院11、kill()#include#include int kill(pid_t pid,int sig);说明:把参数sig指定的信号送给参数pid指定的进程。参数pid有不同取
23、值。返回值:执行成功则返回0,否则返回-1。45网络编程网络编程常州大学信息学院常州大学信息学院12、alarm()#include unsigned int alarm(unsigned int seconds);说明:设置信号SIGALRM在经过参数seconds指定的秒数后传送给调用进程。返回值:返回上次设置的闹钟的剩余秒数,如果之前未设闹钟则返回0。46#include#includevoid handler()printf(“hello!n”);main()int i;signal(SIGALRM,handler);alarm(5);for(i=1;i7;i+)printf(“sle
24、ep%d.n”,i);sleep(1);执行结果:sleep 1.sleep 2.sleep 3.sleep 4.sleep 5.hello!sleep 6.47网络编程网络编程常州大学信息学院常州大学信息学院13、msgsnd()#include#include#include int msgsnd(int msqid,void*msgp,size_t msgsz,int msgflg);说明:发送一个消息到由参数msqid指定标识号的消息队列。返回值:执行成功则返回0,否则返回-1。48网络编程网络编程常州大学信息学院常州大学信息学院14、msgrcv()#include#include#
25、include int msgrcv(int msqid,void*msgp,int msgsz,long msgtyp,int msgflg);说明:从由msqid指定的消息队列中读取一个由msgtyp指定类型的消息到msgp指向的缓冲区中。返回值:执行成功则返回值等于接收到的实际消息正文的字节数0,否则返回-1。49网络编程网络编程常州大学信息学院常州大学信息学院15、msgctl()#include#include#include int msgctl(int msqid,int cmd,struct msqid_ds*buf);说明:提供一系列消息控制操作,操作动作由cmd定义。返回值
26、:执行成功则返回0,否则返回-1。50网络编程网络编程常州大学信息学院常州大学信息学院守护进程守护进程 守护进程是脱离于终端并且在后台运行的进程。在linux或者unix操作系统中在系统引导的时候会开启很多服务,这些服务就叫做守护进程。在网络编程中,一般服务器程序在接收客户机连接请求之前,都要创建一个守护进程。51网络编程网络编程常州大学信息学院常州大学信息学院线程线程 程序:程序:静态的计算机语言编写的代码。进程进程:程序的一次执行。程序代码程序数据程序资源 线程线程:进程中的一个运行实体。程序调用堆栈线程局部变量一点运行中必不可少的资源 多进程多进程:操作系统中多个程序同时执行。多线程多线
27、程:程序中多个片断同时执行。52图示图示:线线程和程和进程进程单进程、单线程如:MS-DOS多进程、每个进程一个线程如:传统的UNIX 单进程、多线程如:一个Java程序多进程、每个进程多个线程如:Windows2000、Solaris、Linux、Mach和OS/2网络编程网络编程常州大学信息学院常州大学信息学院1、线程的执行特性 线程有三个基本运行状态:执行状态执行状态就绪状态就绪状态阻塞状态阻塞状态 五种基本操作:派生派生阻塞阻塞激活激活调度调度结束结束54网络编程网络编程常州大学信息学院常州大学信息学院2、线程的分类 线程有两个基本类型:用户级线程用户级线程系统级线程系统级线程55网络
28、编程网络编程常州大学信息学院常州大学信息学院Windows线程操作线程操作 1、NT线程的有关API CreateThread():创建一个线程 ExitThread():结束本线程 SuspendThread():挂起指定线程 ResumeThread():递减指定线程的挂起计数56网络编程网络编程常州大学信息学院常州大学信息学院2、线程间的同步 多线程间的同步主要有同步机制来完成,同步机制有多种方法。互锁互锁临界区临界区信号量信号量互斥量互斥量事件事件57网络编程网络编程常州大学信息学院常州大学信息学院3、Windows下的多线程编程(1)编写线程函数编写线程函数 所有线程必须从一个指定的
29、函数开始执行,该函数称为线程函数,它必须具有下列原型:DWORDWINAPI MyThreadFunc(LPVOID lpvThreadParm);该函数输入一个LPVOID型的参数,可以是一个DWORD型的整数,也可以是一个指向一个缓冲区的指针,返回一个DWORD型的值。58网络编程网络编程常州大学信息学院常州大学信息学院(2)创建一个线程创建一个线程 一个进程的主线程是由操作系统自动生成,如果要让主线程创建额外的线程,可以调用CreateThread函数来完成。(3)设定线程的相对优先级设定线程的相对优先级 当一个线程被首次创建时,它的优先级等同于它所属进程的优先级。在单个进程内可以通过调
30、用SetThreadPriority函数改变线程的相对优先级。59网络编程网络编程常州大学信息学院常州大学信息学院 BOOL SetThreadPriority(HANDLE hThread,int nPriority)其中参数hThread是指向待修改优先级线程的句柄,nPriority可以是以下的值:THREAD_PRIORITY_LOWESTTHREAD_PRIORITY_BELOW_NORMALTHREAD_PRIORITY_NORMALTHREAD_PRIORITY_ABOVE_NORMALTHREAD_PRIORITY_HIGHEST60网络编程网络编程常州大学信息学院常州大学信息
31、学院(4)挂起及恢复线程挂起及恢复线程 在创建线程时使用CREATE_SUSPENDED标志可以挂起线程,还可以用SuspendThread函数挂起线程。DWORDSuspendThread(HANDLE hThread);一个线程可以被挂起多次。如果一个线程被挂起3次,则该线程在它被分配CPU之前必须被恢复3次。(5)终止线程终止线程 调用了ExitThread 函数可以终止本线程。61网络编程网络编程常州大学信息学院常州大学信息学院六、信号六、信号 信号的基本概念信号的基本概念 信号也称为软件中断,是一种进程通信的方法。系统用它通知一个或多个进程异步事件的发生。所有的信号都有自己的名字,这
32、些名字都是以SIG开头的,只是后面有所不同,通过这些名字可以了解到系统中到底发生了些什么事。62网络编程网络编程常州大学信息学院常州大学信息学院 当进程接收到一个信号,它可以采取以下三种动作:忽略忽略信号信号:大多数信号采用的处理方式,但是SIGSTOP与SIGKILL除外。捕获捕获信号信号:当某种信号出现时,可以调用相应的函数进行处理。但是SIGSTOP与SIGKILL除外。执行系统的执行系统的默认默认动作动作:对大多数信号而言,系统的默认动作都是终止该进程。63网络编程网络编程常州大学信息学院常州大学信息学院信号机制信号机制内核如何向一个进程发送信号进程如何接收一个信号内核在什么时机处理和
33、怎样处理进程收到的信号进程怎样控制自己对信号的反应64网络编程网络编程常州大学信息学院常州大学信息学院信号的系统调用信号的系统调用 1、signal系统调用#include void(*signal(int signo,void(*func)(int)(int);说明:按参数signo指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数func指定的函数执行。返回值:返回先前的信号处理函数指针,否则返回SIG_ERR。65网络编程网络编程常州大学信息学院常州大学信息学院2、kill系统调用#include#include int kill(pid_t pid,int sig)
34、;说明:把参数sig指定的信号送给参数pid指定的进程。参数pid有不同取值。返回值:执行成功则返回0,否则返回-1。66网络编程网络编程常州大学信息学院常州大学信息学院3、raise系统调用 int raise(int sig);说明:向当前进程发送sig信号。返回值:调用成功时返回0,否则返回-1。67网络编程网络编程常州大学信息学院常州大学信息学院4、pause和sigsuspend系统调用#include int pause(void);int sigsuspend(const sigset_t*sigmask);说明:pause会令目前的进程暂停(进入睡眠状态),直到收到一个信号。s
35、igsuspend可以暂时将当前阻塞信号集改变为由sigmask指定的信号集。返回值:总是返回-1。68网络编程网络编程常州大学信息学院常州大学信息学院5、alarm和setitimer系统调用#include intgetitimer(intwhich,structitimerval*value);intsetitimer(intwhich,conststructitimerval*value,structitimerval*ovalue);说明:setitimer用来设置定时器,getitimer用来得到定时器的状态。返回值:调用成功时返回0,否则返回-1。69网络编程网络编程常州大学信息
36、学院常州大学信息学院6、信号初始化操作 intsigemptyset(sigset_t*set);int sigfillset(sigset_t*set);int sigaddset(sigset_t*set,int signo);int sigdelset(sigset_t*set,int signo);int sigismember(sigset_t*set,int signo);int sigprocmask(int how,const sigset_t*set,sigset_t*oldset);70网络编程网络编程常州大学信息学院常州大学信息学院七、七、应用程序与设备驱动程序应用程序与
37、设备驱动程序之间的接口之间的接口 Windows环境下驱动程序共有三类。VxD(Virtual Device Driver,虚拟设备驱动程序),用于Windows 9x系列中;KMD(Kernel Mode Driver,内核模式驱动程序),用于Windows NT下;WDM(Win32 Driver Mode,Win32驱动程序模型),是一个跨平台的驱动模型。71网络编程网络编程常州大学信息学院常州大学信息学院1、应用程序与硬件之间的接口 应用程序和硬件设备之间的沟通是由驱动程序来完成的,设备驱动程序对应用程序屏蔽外设硬件细节,这样对应用程序来说,外设只是一个设备文件,应用程序可以像操作普通文件一样来操作外设。Windows环境下应用程序通常使用Win32 API函数来访问设备,常用的函数有CreatFile,ReadFile,WriteFile,CloseHandle和DeviceIoControl等等。72网络编程网络编程常州大学信息学院常州大学信息学院八、字节顺序八、字节顺序 0 x77 0 x88低地址 高地址0 x88 0 x77高地址低地址 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。Big-Endian Little-Endian 73
限制150内