您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > Unix_Socket
UNIX网络编程•精灵进程、守候进程(daemon)•交易型中间件•网络编程守候进程•守候进程(daemon),也叫精灵进程,或服务器进程,是生存期最长的一种进程。它们常常在系统引导装入时启动,在系统关闭时终止。它们是在后台运行的。•精灵进程的特征–生命期无限长,在系统引导装入时起动,在系统关闭时终止。–没有控制终端,没有人机交互,在后台运行。客户机/服务器(C/S)模型•一般而言,服务器是一个进程,它等待客户机与其联系,提出某种类型的服务要求。•C/S模式在操作过程中采取的是主动请求方式。•服务对客户提供机服务可,将结果信息返回给客户机(双向),也可不返回(单向)。•就双向C/S来讲,又分为重复型和并发型两种。•在网络编程中,一般来说,TCP服务器是并发的,而UDP服务器是重复的。C/S模型ServerClient_nClient_1……重复型服务•重复型服务器通过以下步骤进行交互:(1)打开一通信通道并告知本地主机,它愿意在某一公认地址端口上接收客户请求。(2)等待一个客户请求的到来;(3)处理客户请求;(4)将服务结果数据发送给请求的客户;(5)返回步骤(2)•重复型服务器主要的问题发生在第(3)步。在这期间,它不能接收其它客户请求,因而不能为其他客户机提供服务。并发型服务•并发型服务器采用以下步骤进行交互:(1)打开一通信通道并告知本地主机,它愿意在某一公认地址端口上接收客户请求。(2)等待一个客户请求的到来;(3)启动一个新的服务器来处理这个客户的请求。–启动一个新的服务器的方法可能不同,可能是生成一个新的进程或线程,这依赖于所使用的操作系统或开发系统的支持。新生成的服务器对客户的全部请求进行处理。处理完毕后,终止这个新服务器。(4)返回步骤(2)•并发服务器的优点在于它是利用生成其他服务器的方法来处理客户的请求。它可以同时并发地为多个客户机服务。客户方(1)打开一通信通道,并连接到服务器所在主机的特定端口。(2)向服务器发服务请求,等待并接收应答。(3)请求结束后关闭通信通道。交易型中间件•在中间件诞生之前,多采用传统C/S二层结构。这种二层结构是计算机及软件技术发展的一大进步。•虽然它带来了相当的灵活性,但也逐渐暴露出其客户端和服务器端负担过重的现象,并且拓展性也较差,无法跨越不同的业务部门和业务系统。•这不仅表现在技术上有难度,更重要的是在制度和安全方面。于是,三层结构出现了。三层结构•所谓三层结构,就是在原有的两层结构之间,增加一个中间层。该中间层既包括服务也包括请求。–服务包括事务处理应用服务和数据库查询代理等,对于更多实时业务系统而言,该层的主要作用是通讯转发、协议转换和安全控制;–请求主要表现在当需要跨越不同业务系统和业务部门时,根据实际业务的需要,再以C/S方式向对方或目的方提出请求,当服务信息返回后,再将自己的客户请求的应答信息返回给自己的客户,这才是实现中间件的真正目的。•两层结构向三层结构转变后,中间件可分担部分客户端和服务端的工作量,因此客户端和服务器端的负载就相应减轻了。最关键的是中间件的引入实现了跨平台、跨业务部门的服务和传输,解决了信息传输不可靠和部门、企业间的安全控制等问题。中间件工作机制•中间件,从本质上是对分布式应用的抽象,它抛开了与应用相关的业务的细节,保留了典型的分布交互模式的关键特征,将纷繁复杂的分布式系统经过提炼和必要的隔离后,以统一的层面形式呈现给应用。•中间件在整个分布式系统中起数据总线的作用,将各种异构系统通过中间件有机地结合成一个整体。•它的工作机制是:当客户端上的应用程序需要从网络中某个节点处获取一定的数据或服务时,这些数据和服务可能处于一个运行着和客户端不同的硬、软件、网络或操作系统的平台上。C/S应用程序中负责寻找数据的部分只需访问一个中间件系统,由中间件完成到网络中找到数据源或服务,进而实现传输客户请求、重组答复信息,最后将结果送回应用程序的任务。中间件模型MiddleWareServer_1……Client_1Client_nServer_m……中间件的种类•1.消息中间件:主要功能是在不同的网络协议、不同的操作系统和不同的应用程序之间提供可靠的消息传送。•2.交易中间件:负责正确传递交易,对交易完整性进行管理,调度应用程序的运行,保证整个系统运行的高效性。•3.对象中间件:它类似于软总线,解决面向对象、数据一致性、应用集成等关键任务的需求。•4.安全平台:以公钥基础设施(PKI)为核心、建立在一系列相关国际安全标准之上的一个开放式应用开发平台。它向上为应用系统提供开发接口,向下提供统一的密码算法接口及各种IC卡、安全芯片等设备的驱动接口。•5.数据库中间件:ODBC。socket的引入•socket程序库是UNIX网络上最普遍的API,可调用socket程序库提供的各个程序开发网络软件和网络系统。•TCP/IP协议被集成到UNIX内核中时,相当于在UNIX系统引入了一种新型的I/O操作,但这种I/O比传统复杂得多。•在UNIX系统中,网络应用编程界面有两类:UNIXBSD的套接字(socket)和UNIXSystemV的TLI。由于Sun公司采用了支持TCP/IP的UNIXBSD操作系统,使TCP/IP的应用有更大的发展,其网络应用编程界面(套接字)在网络软件中被广泛应用。套接字类型•流式套接字(SOCK-STREAM):提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。•数据报式套接字(SOCK-DGRAM):提供了一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。•原始式套接字(SOCK-RAW):该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。基本套接字系统调用•创建套接字—socket()•地址绑定—bind()•建立连接—connect()与accept()•监听连接—listen()•数据传输—send()/write()与recv()/read()•关闭套接字—close()创建套接字—socket()•socket()向应用程序提供创建套接字的手段。其调用格式如下:–#includesys/socket.h–intsocket(intdomain,inttype,intprotocol);•参数:–domain(协议族):AF_INET,AF_UNIX,AF_IPX,…–type(类型):SOCK_STREAM,SOCK_DGRAM–protocol(协议):0-让系统使用指定类型和协议族上的默认协议。•返回值:一个整型套接字号(文件描述符)。绑定本地地址—bind()•socket()创建后,存在一个名字空间(地址族)中,但它没有被命名。bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号绑定起来,即将名字赋予套接字,以指定本地半相关。其调用格式如下:–#includesys/socket.h–intbind(intsockfd,conststructsockaddr*my_addr,intaddrlen);•参数:–sockfd:为socket成功时的返回值—套接字描述符。–my_addr:为本方地址数据结构。–addrlen=sizeof(my_addr).•返回值:整数,0-成功,非0-错误。监听连接—listen()•用于面向连接的服务器,表明它愿意接收连接。1isten()需在accept()之前调用,其调用格式如下:–#includesys/socket.h–intlisten(ints,intbacklog);•listen()在执行调用过程中可为没有调用过bind()的套接字s完成所必需的连接,并建立长度为backlog的请求连接队列。•backlog定义最大长度的socket等待队列。默认值为5.connect(),accept()•这两个系统调用用于完成一个完整相关的建立,其中connect()用于客户建立连接。accept()用于使服务器等待来自某客户进程的实际连接。•connect:客户方调用发出的请求–intconnect(intsockfd,conststructctsockaddr*server_addr,socklen_taddrlen);–在面向连接的协议中,该调用导致本地系统和外部系统之间连接实际建立。•accept:服务器调用,等待从编号为s的套接字上接受客户连接请求–intaccept(ints,structsockaddr*addr,socklen_taddrlen);–accept()用于面向连接服务器。connect与accept的说明•调用accept()后,服务器等待从编号为s的套接字上接受客户连接请求,连接请求是由客户方的connect()调用发出的。•当有连接请求到达时,accept()调用将请求连接队列上的第一个客户方套接字地址及长度放入addr和addrlen,并创建一个与s有相同特性的新套接字号。•新的套接字s用于处理服务器并发请求。数据传输:send()/write与recv()/read()•当一个连接建立以后,就可以传输数据了。常用的系统调用有send/write和recv/read。用于在参数s指定的已连接的数据报或流套接字上发送输出数据。send/write用于数据发送,recv/read用于数据接收。•调用格式与文件系统的read()和write相同。•recv/send可由文件系统调用read/write所取代。在处理二进制数据处理时,后者优于前者。关闭套接字:close()•close()关闭套接字s,并释放分配给该套接字的资源;如果s涉及一个打开的TCP连接,则该连接被释放。•close()的调用格式如下:–intclose(ints);字节顺序•网络字节顺序:TCP/IP使用大端字节来传输协议信息。•大端(尾)数(big-endian)把高位字节放在低地址,而小尾(端)数(little-endian)则把高位字节存放在高地址空间。•需要在机器字节顺序与网络字节顺序转换的可使用下列函数:–unsigndinthtonl(unsignedinthostlong)–unsigndshorthtons(unsignedinthostshort)–unsigndintnhtonl(unsignedintnetlong)–unsigndintnhtons(unsignedintnetshort)•前两个是正向的,后两者是反向的。这时里的“长整数”指的是32位,而不是C语言的长整数。地址转换•应用程序常常需要在点分十进制的IP与二进制形式IP间的转换。•以下函数可以实现这种转换:–#includenetinet/in.h–#includesocket.h–#includearpa/inet.h–intinet_aton(constchar*ddaddress,structin_addr*adress)–char*inet_ntoa(structin_addraddress);–unsignedlongintinet_addr(constchar*ddaddress);主机信息及相关数据结构和函数structhostent{char*h_name;//Officialnameofhostchar**h_aliases;//Aliaslist.inth_addrtype;//Hostaddresstypeinth_length;//Lengthofaddresschar**h_addr_list;//ListofaddrsfromNS};参见netdb.h主机信息及相关数据结构和函数•#includenetdb.h•structhostent*gethostbyname(constchar*name)–name:为
本文标题:Unix_Socket
链接地址:https://www.777doc.com/doc-3955242 .html