《UNIX_Socket编程.ppt》由会员分享,可在线阅读,更多相关《UNIX_Socket编程.ppt(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、UNIX网络编程精灵进程、守候进程(daemon)交易型中间件网络编程精灵进程、守候进程精灵进程(daemon),也叫守候进程,是生存期长的一种进程。它们常常在系统引导装入时起动,在系统关闭时终止。因为它们没有控制终端,所以说它们是在后台运行的。UNIX系统有很多精灵进程,它们执行日常事物活动:linit:初始化进程;lbdflush:块设备的定期同步;lkswapd:负责交换管理lsyslogd:记录系统中的登录信息;lxinetd:所有(网络)服务进程的守候;lcron:负责进程的定期或定时执行。精灵进程的特征与编程规则生命期无限长,在系统引导装入时起动,在系统关闭时终止。没有控制终端,所
2、以说它们是在后台运行的。客户机/服务器(C/S)模型一般而言,服务器是一个进程,它等待客户机与其联系,提出某种类型的服务要求。C/S模式在操作过程中采取的是主动请求方式。服务对客户机服务可将结果或信息返回给客户机(双向),也可不返回(单向)。就双向C/S来讲,又分为重复型和并发型两种。在网络编程中,一般来说,TCP服务器是并发的,而UDP服务器是重复的。C/S模型ServerClient_nClient_1 重复型 重复型服务器通过以下步骤进行交互:(1)打开一通信通道并告知本地主机,它愿意在某一公认地址端口上接收客户请求。(2)等待一个客户请求的到来;(3)处理客户请求;(4)将服务结果数据
3、发送给请求的客户;(5)返回步骤(2)重复型服务器主要的问题发生在第(3)步。在这期间,它不能接收其它客户请求,因而不能为其他客户机提供服务。并发型 并发型服务器采用以下步骤进行交互:(1)打开一通信通道并告知本地主机,它愿意在某一公认地址端口上接收客户请求。(2)等待一个客户请求的到来;(3)启动一个新的服务器来处理这个客户的请求。l启动一个新的服务器的方法可能不同,可能是生成一个新的进程或线程,这依赖于所使用的操作系统或开发系统的支持。新生成的服务器对客户的全部请求进行处理。处理完毕后,终止这个新服务器。(4)返回步骤(2)并发服务器的优点在于它是利用生成其他服务器的方法来处理客户的请求。
4、它可以同时并发地为多个客户机服务。客户方(1)打开一通信通道,并连接到服务器所在主机的特定端口。(2)向服务器发服务请求,等待并接收应答;(3)请求结束后关闭通信通道。交易型中间件在中间件诞生之前,多采用传统C/S二层结构。这种二层结构是计算机及软件技术发展的一大进步。虽然它带来了相当的灵活性,但也逐渐暴露出其客户端和服务器端负担过重的现象,并且拓展性也较差,无法跨越不同的业务部门和业务系统。这不仅表现在技术上有难度,更重要的是在制度和安全方面。于是,三层结构出现了。三层结构所谓三层结构,就是在原有的两层结构之间,增加一个中间层。该中间层既包括服务也包括请求。l服务包括事务处理应用服务和数据库
5、查询代理等,对于更多实时业务系统而言,该层的主要作用是通讯转发、协议转换和安全控制;l请求主要表现在当需要跨越不同业务系统和业务部门时,根据实际业务的需要,再以C/S方式向对方或目的方提出请求,当服务信息返回后,再将自己的客户请求的应答信息返回给自己的客户,这才是实现中间件的真正目的。两层结构向三层结构转变后,中间件可分担部分客户端和服务端的工作量,因此客户端和服务器端的负载就相应减轻了。最关键的是中间件的引入实现了跨平台、跨业务部门的服务和传输,解决了信息传输不可靠和部门、企业间的安全控制等问题。中间件工作机制中间件,从本质上是对分布式应用的抽象,它抛开了与应用相关的业务的细节,保留了典型的
6、分布交互模式的关键特征,将纷繁复杂的分布式系统经过提炼和必要的隔离后,以统一的层面形式呈现给应用。中间件在整个分布式系统中起数据总线的作用,将各种异构系统通过中间件有机地结合成一个整体。它的工作机制是:当客户端上的应用程序需要从网络中某个节点处获取一定的数据或服务时,这些数据和服务可能处于一个运行着和客户端不同的硬、软件、网络或操作系统的平台上。C/S应用程序中负责寻找数据的部分只需访问一个中间件系统,由中间件完成到网络中找到数据源或服务,进而实现传输客户请求、重组答复信息,最后将结果送回应用程序的任务。中间件模型MiddleWareServer_1 Client_1Client_nServe
7、r_m 中间件的种类1.消息中间件:主要功能是在不同的网络协议、不同的操作系统和不同的应用程序之间提供可靠的消息传送。2.交易中间件:负责正确传递交易,对交易完整性进行管理,调度应用程序的运行,保证整个系统运行的高效性。3.对象中间件:它类似于软总线,解决面向对象、数据一致性、应用集成等关键任务的需求。4.安全平台:以公钥基础设施(PKI)为核心、建立在一系列相关国际安全标准之上的一个开放式应用开发平台。它向上为应用系统提供开发接口,向下提供统一的密码算法接口及各种IC卡、安全芯片等设备的驱动接口。5.数据库中间件:ODBC。socket的引入的引入socket程序库是UNIX网络上最普及的A
8、PI,可调用socket程序库提供的各个程序开发网络软件和网络系统。TCP/IP协议被集成到UNIX内核中时,相当于在UNIX系统引入了一种新型的I/0操作。UNIX用户进程与网络协议的交互作用比用户进程与传统的I/O设备相互作用复杂得多。在UNIX系统中,网络应用编程界面有两类:UNIX BSD的套接字(socket)和UNIX System V的TLI。由于Sun公司采用了支持TCP/IP的UNIX BSD操作系统,使TCP/IP的应用有更大的发展,其网络应用编程界面(套接字)在网络软件中被广泛应用。套接字类型 流式套接字(SOCK-STREAM):提供了一个面向连接、可靠的数据传输服务,
9、数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传送协议(FTP)即使用流式套接字。数据报式套接字(SOCK-DGRAM):提供了一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。原始式套接字(SOCK-RAW):该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。基本套接字系统调用 创建套接字socket()地址绑定bind()建立连接connect()与accept()监听连接listen()数据传输send()/write()与re
10、cv()/read()关闭套接字close()创建套接字socket()应用程序在使用套接字前,必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段。其调用格式如下:l#includelint socket(int domain,int type,int protocol);该调用要接收3个参数,根据这3个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号,只和一个特定的协议相联系。实际上指定了相关五元组中的“协议”这一元。ldomain(协议族):AF_INET,AF_UNIX,AF_IPX,ltype(类型):SOCK_STREAM,SOCK_DGR
11、AMlprotocol(协议):0-让系统使用指定类型和协议族上的默认协议。绑定本地地址bind()当一个套接字用socket()创建后,存在一个名字空间(地址族),但它没有被命名,bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号绑定起来,即将名字赋予套接字,以指定本地半相关。其调用格式如下:l#include lint bind(int sockfd,const struct sockaddr*my_addr,int addrlen);说明:lsockfd:为socket成功时的返回值套接字描述符。lmy_addr为本方地址数据结构。laddrlen=sizeof
12、(my_addr).监听连接listen()此调用用于面向连接服务器,表明它愿意接收连接。1isten()需在accept()之前调用,其调用格式如下:l#includelint listen(int s,int backlog);listen()在执行调用过程中可为没有调用过bind()的套接字s完成所必需的连接,并建立长度为backlog的请求连接队列。backlog定义最大长度的socket等待队列。默认值为5.connect(),accept()这两个系统调用用于完成一个完整相关的建立,其中connect()用于客户建立连接。accept()用于使服务器等待来自某客户进程的实际连接。c
13、onnect:客户方调用发出的请求lint connect(int sockfd,const structct sockaddr *server_addr,socklen_t addrlen);l在面向连接的协议中,该调用导致本地系统和外部系统之间连接实际建立。accept:服务器调用,从等待从编号为s的套接字上接受客户连接请求lint accept(int s,struct sockaddr*addr,socklen_t addrlen);laccept()用于面向连接服务器。connect与accept的说明调用accept()后,服务器等待从编号为s的套接字上接受客户连接请求,连接请求是
14、由客户方的connect()调用发出的。当有连接请求到达时,accept()调用将请求连接队列上的第一个客户方套接字地址及长度放入addr和addrlen,并创建一个与s有相同特性的新套接字号。新的套接字可用于处理服务器并发请求。数据传输:send()/write与recv()/read()当一个连接建立以后,就可以传输数据了。常用的系统调用有send()和recv()。send()调用用于在参数s指定的已连接的数据报或流套接字上发送输出数据,格式如下:lint send(int s,void*buf,int len,int flags);lint recv(int s,void*buf,in
15、t len,int flags);recv/send可由文件系统调用read/write所取代。在处理二进制数据处理时,后者优于前者。关闭套接字:close()close()关闭套接字s,并释放分配给该套接字的资源;如果s涉及一个打开的TCP连接,则该连接被释放。close()的调用格式如下:lint close(int s);字节顺序网络字节顺序:TCP/IP使用大端字节来传输协议信息。大端(尾)数(big-endian)把高位字节放在低地址,而小尾(端)数(little-endian)则把高位字节存放在高地址空间。需要在机器字节顺序与网络字节顺序转换的可使用下列函数:lunsignd in
16、t htonl(unsigned int hostlong)lunsignd short htons(unsigned int hostshort)lunsignd int nhtonl(unsigned int netlong)lunsignd int nhtons(unsigned int netshort)前两个是正向的,后两者是反向的。这时里的“长整数”指的是32位,而不是C语言的长整数。地址转换应用程序常常需要在点分十进制的IP与二进制形式IP间的转换。以下函数可以实现这种转换:l#include l#include l#includelint inet_aton(const cha
17、r*ddaddress,struct in_addr*adress)lchar*inet_ntoa(struct in_addr address);lunsigned long int inet_addr(const char*ddaddress);主机信息及相关数据结构和函数struct hostent char*h_name;/Official name of hostchar*h_aliases;/Alias list.inth_addrtype;/Host address typeinth_length;/Length of addresschar*h_addr_list;/List
18、of addrs from NS;参见netdb.h主机信息及相关数据结构和函数#includestruct hostent*gethostbyname(const char*name)lname:为主机名。可以是域名,也可在/etc/hosts中定义。struct hostent*gethostbyadress(const char*addr,int len,int type)laddr::是一个指向in_addr的结构(见netinet/in.h);llen指明addr的长度;ltype:对于SCOK_STREAM,type为AF_INET。服务器端相关的数据结构和函数struct ser
19、vent char*s_name;/Official service name.char*s_aliases;/Alias list.ints_port;/Port number.char*s_proto;/Protocol to use.;参见netdb.h服务器端相关的数据结构和函数#includestruct servent*getservbyname(const char*name,const char*protocal);lname与protocal均定义在/etc/services中:lname:服务名;lprotocal:为协议struct servent*getservbypo
20、rt(int port,const char*protocal);l直接使用数字作为端口号,建议不要这样做,因为不便配置。IP socket地址#include#include structsockaddr_in short intsin_family;/AF_INETunsigned short int sin_port;/port No.struct in_addrsin_addr;/IP addr.典型套接字调用过程 socket开发示例现在几乎所有支持网络开发的系统,都支持socket开发。比如VB的winsock控件,Windows socket库,MS MFC的CAsynSocket和Csocket类,.net的System.Net.Sockets,Java,Delphi,perl等都有相应的类。不同开发环境可实现指定功能,完成通信和联网。这里给出UNIX Socket的开发框架示例程序,他们分别是客户端、服务端和中间件。