互联网及其应用5-3-socket和编程

上传人:wuy****ng 文档编号:245317829 上传时间:2024-10-08 格式:PPT 页数:30 大小:222.13KB
返回 下载 相关 举报
互联网及其应用5-3-socket和编程_第1页
第1页 / 共30页
互联网及其应用5-3-socket和编程_第2页
第2页 / 共30页
互联网及其应用5-3-socket和编程_第3页
第3页 / 共30页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,套接口与通信编程,套接口,API:应用程序接口,套接字socket API,套接字库和操作系统,套接字通信和UNIX I/O 关系,描述符、网络IO集成优势:,小整数描述符:不必每次传输指明远程目的地址细节,Open,read,write,close,函数,参数与选项:选取特定传输协议远程机器地址客户还是服务器等细节,socket概述,linux目前的网络内核代码主要基于伯克利的BSD的unix实现,,linux网络API是基于BSD套接口的(系统V提供基于流I/O子系统的用户接口,但是linux内核目前不支持流I/O子系统)。,linux以文件的形式实现套接口,与套接口相应的文件属于sockfs特殊文件系统,创建一个套接口就是在sockfs中创建一个特殊文件,并建立起为实现套接口功能的相关数据结构。,对每一个新创建的BSD套接口,linux内核都将在sockfs特殊文件系统中创建一个新的inode。描述套接口的数据结构是socket,将在后面给出,Socket 编程重要数据结构,套接口是由,socket,数据结构代表的,形式如下,struct socket,socket_state state; /* 指明套接口的连接状态,一个套接口的连接状态可以有以下几种,套接口是空闲的,还没有进行相应的端口及地址的绑定;还没有连接;正在连接中;已经连接;正在解除连接。 */,unsigned longflags;,struct proto_opsops; /* 指明可对套接口进行的各种操作 */,struct inodeinode;/* 指向sockfs文件系统中的相应inode */,struct fasync_struct*fasync_list;/* Asynchronous wake up list*/,struct file*file;/* 指向sockfs文件系统中的相应文件*/,struct socksk; /* 任何协议族都有其特定的套接口特性,该域就指向特定协议族的套接口对,象。 */,wait_queue_head_twait;,shorttype;,unsigned charpasscred;,;,描述套接口通用地址的数据结构,struct sockaddr,struct sockaddr ,sa_family_tsa_family;/* address family, AF_xxx*/,charsa_data14;/* 14 bytes of protocol address*/,;,由于历史的缘故,在,bind,、,connect,等系统调用中,特定于协议的套接口地址结构指针都要强制转换成该通用的套接口地址结构指针,描述因特网地址结构的数据结构,struct sockaddr_in,struct sockaddr_in,_SOCKADDR_COMMON (sin_);/* 描述协议族 */,in_port_t sin_port;/* 端口号 */,struct in_addr sin_addr;/* 因特网地址 */,/* Pad to size of struct sockaddr. */,unsigned char sin_zerosizeof (struct sockaddr) -,_SOCKADDR_COMMON_SIZE -,sizeof (in_port_t) -,sizeof (struct in_addr);,;,套接口编程的几个重要步骤,创建套接口,由系统调用,socket,实现,参数domain指明通信域,如PF_UNIX(unix域),PF_INET(IPv4),PF_INET6(IPv6)等;type指明通信类型,如SOCK_STREAM(面向连接方式)、SOCK_DGRAM(非面向连接方式)等。一般来说,参数protocol可设置为0,除非用在原始套接口上(原始套接口有一些特殊功能,后面还将介绍)。,int socket( int domain, int type, int ptotocol);,创建套接口,注:,socket,()系统调用为套接口在,sockfs,文件系统中分配一个新的文件和,dentry,对象,并通过文件描述符把它们与调用进程联系起来。进程可以像访问一个已经打开的文件一样访问套接口在,sockfs,中的对应文件。但进程绝不能调用,open(),来访问该文件(,sockfs,文件系统没有可视安装点,其中的文件永远不会出现在系统目录树上),当套接口被关闭时,内核会自动删除,sockfs,中的,inodes,。,绑定地址,根据传输层协议(TCP、UDP)的不同,客户机及服务器的处理方式也有很大不同。但是,不管通信双方使用何种传输协议,都需要一种标识自己的机制。,通信双方一般由两个方面标识:地址和端口号(通常,一个,IP,地址和一个端口号常常被称为一个套接口)。根据地址可以寻址到主机,根据端口号则可以寻址到主机提供特定服务的进程,实际上,一个特定的端口号代表了一个提供特定服务的进程。,对于使用,TCP,传输协议通信方式来说,通信双方需要给自己绑定一个唯一标识自己的套接口,以便建立连接;对于使用,UDP,传输协议,只需要服务器绑定一个标识自己的套接口就可以了,用户则不需要绑定,(,在需要时,如调用,connect,时,注,1,,内核会自动分配一个本地地址和本地端口号,),。,绑定地址,绑定操作由系统调用,bind(),完成,int bind( int sockfd, const struct sockaddr * my_addr, socklen_t my_addr_len),第二个参数对于,Ipv4,来说,实际上需要填充的结构是,struct sockaddr_in,,前面已经介绍了该结构。这里只想强调该结构的第一个域,它表明该套接口使用的通信协议,如,AF_INET,。联系,socket,系统调用的第一个参数,实际上,原来的想法是每个通信域(如,PF_INET,)可能对应多个协议(如,AF_INET,),而事实上支持多个协议的通信域一直没有实现。因此,在,linux,内核中,,AF_*,与,PF_*,被定义为同一个常数,因此,在编程时可以不加区分地使用他们。,请求建立连接(,TCP,客户发起),对于采用面向连接的传输协议,TCP,实现通信来说,一个比较重要的步骤就是通信双方建立连接(如果采用,udp,传输协议则不需要),由系统调用,connect(),完成,int connect( int sockfd, const struct sockaddr * servaddr, socklen_t addrlen),第一个参数为本地调用socket后返回的描述符,第二个参数为服务器的地址结构指针。connect()向指定的套接口请求建立连接。,请求建立连接,与,connect,()相对应,在服务器端,通过系统调用,listen(),,指定服务器端的套接口为监听套接口,监听每一个向服务器套接口发出的连接请求,并通过握手机制建立连接。内核为,listen(),维护两个队列:已完成连接队列和未完成连接队列。,接受连接请求(由,TCP,服务器端发起,),服务器端通过监听套接口,为所有连接请求建立了两个队列:已完成连接队列和未完成连接队列(每个监听套接口都对应这样两个队列,当然,一般服务器只有一个监听套接口)。通过,accept(),调用,服务器将在监听套接口的已连接队列头中,返回用于代表当前连接的套接口描述字。,接受连接请求,int accept( int sockfd, struct sockaddr * cliaddr, socklen_t * addrlen),第一个参数指明哪个监听套接口,一般是由listen()系统调用指定的(由于每个监听套接口都对应已连接和未连接两个队列,因此它的内部机制实质是通过sockfd指定在哪个已连接队列头中返回一个用于当前客户的连接,如果相应的已连接队列为空,accept进入睡眠)。第二个参数指明客户的地址结构,如果对客户的身份不感兴趣,可指定其为空。,注:,对于采用,TCP,传输协议进行通信的服务器和客户机来说,一定要经过客户请求建立连接,服务器接受连接请求这一过程;而对采用,UDP,传输协议的通信双方则不需要这一步骤,通信,客户机可以通过套接口接收服务器传过来的数据,也可以通过套接口向服务器发送数据。前面所有的准备工作(创建套接口、绑定等操作)都是为这一步骤准备的。,常用的从套接口中接收数据的调用有:,recv,、,recvfrom,、,recvmsg,等,常用的向套接口中发送数据的调用有,send,、,sendto,、,sendmsg,等。,强调一下,,recvfrom,()以及,recvmsg,()可用于面向连接的套接口,也可用于面向非连接的套接口;而,recv,()一般用于面向连接的套接口。另外,在调用了,connect(),之后,就应给调用,send(),而不是,sendto(),了,因为调用了,connect,之后,目标就已经确定了,通信,int recv(int s, void *,buf, size_t,len, int,flags,),int recvfrom(int s, void *,buf, size_t,len, int,flags, struct sockaddr *,from, socklen_t *,fromlen,),int recvmsg(int s, struct msghdr *,msg, int,flags,),int send(int s,const void *,msg, size_t,len, int,flags,),int sendto(int s, const void *,msg, size_t,len, int,flags,const struct sockaddr *,to, socklen_t,tolen,),int sendmsg(int s, const struct msghdr *,msg, int,flags,),通信,socket,()系统调用返回套接口描述字,实际上它是一个文件描述符。所以,可以对套接口进行通常的读写操作,即使用,read(),及,write(),方法。在实际应用中,由于面向连接的通信(采用,TCP,传输协议)是可靠的,同时又保证字节流原有的顺序,所以更适合用,read,及,write,方法。而非面向连接的通信(采用,UDP,传输协议)是不可靠的,字节流也不一定保持原有的顺序,所以一般不宜用,read,及,write,方法。,关闭套接口,由,close(),来完成此项功能,它唯一的参数是套接口描述字,不再赘述,下一页给出常用调用流程,套接字API过程,典型TCP服务器代码,上述典型调用说明,端口号的分配是有一些惯例的,不同的端口号对应不同的服务或进程。比如一般都把端口号21分配给FTP服务器的TCP/IP实现。端口号一般分为3段,0-1023(受限的众所周知的端口,由分配数值的权威机构IANA管理),1024-49151(可以从IANA那里申请注册的端口),49152-65535(临时端口,这就是为什么代码中的端口号为49152)。,对于多字节整数在内存中有两种存储方式:一种是低字节在前,高字节在后,这样的存储顺序被称为低端字节序(,little-endian,);高字节在前,低字节在后的存储顺序则被称为高端字节序(,big-endian,)。网络协议在处理多字节整数时,采用的是高端字节序,而不同的主机可能采用不同的字节序。因此在编程时一定要考虑主机字节序与网络字节序间的相互转换。这就是程序中使用,htons,函数的原因,它返回网络字节序的整数,典型的,TCP,客户代码,典型调用说明,对比两段代码可以看出,许多调用是服务器或客户机所特有的。另外,对于非面向连接的传输协议,代码还有简单些,没有连接的发起请求和接收请求部分,网络编程中的其他重要概念 I/O复用的概念,I/O,复用提供一种能力,这种能力使得当一个,I/O,条件满足时,进程能够及时得到这个信息。,I/O,复用一般应用在进程需要处理多个描述字的场合。它的一个优势在于,进程不是阻塞在真正的,I/O,调用上,而是阻塞在,select(),调用上,,select(),可以同时处理多个描述字,如果它所处理的所有描述字的,I/O,都没有处于准备好的状态,那么将阻塞;如果有一个或多个描述字,I/O,处于准备好状态,则,select(),不阻塞,同时会根据准备好的特定描述字采取相应的,I/O,操作。,原始套接口,原始套接口,原始套接口提供一般套接口所不提供的功能:,原始套接口可以读写一些用于控制的控制协议分组,如ICMPv4等,进而可实现一些特殊功能。,原始套接口可以读写特殊的IPv4数据包。内核一般只处理几个特定协议字段的数据包,那么一些需要不同协议字段的数据包就需要通过原始套接口对其进行读写;,通过原始套接口可以构造自己的Ipv4头部,也是比较有意思的一点。,创建原始套接口需要,root,权限,对数据链路层的访问,对数据链路层的访问,使得用户可以侦听本地电缆上的所有分组,而不需要使用任何特殊的硬件设备,在,linux,下读取数据链路层分组需要创建,SOCK_PACKET,类型的套接口,并需要有,root,权限,多播,linux,内核支持多播,但是在默认状态下,多数,linux,系统都关闭了对多播的支持。因此,为了实现多播,可能需要重新配置并编译内核,linux,套接口编程的内容可以说是极大丰富,同时它涉及到许多的网络背景知识,有兴趣的读者可在网上找到比较系统而全面的介绍,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!