资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,互联网程序设计,电子科大计算机学院,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,*,?互联网程序设计?,第三讲 客户端软件设计,电子科技大学计算机学院,赵洋,互联网程序设计,电子科大计算机学院,在程序中使用套接字调用,使用TCP的客户和效劳器套接字函数调用序列,socket,客户端,connect,send,recv,close,socket,服务器端,bind,listen,accept,close,send,recv,互联网程序设计,电子科大计算机学院,套接字调用参数使用的符号常量,UNIX系统提供了预定义的符号常量和数据结构来声明数据和指明参数:,使用何种效劳:,SOCK_DGRAM:数据报效劳,UDP协议,SOCK_STREAM:流效劳,TCP协议,PF_INET:使用TCP/IP协议族,AF_INET:使用TCP/IP地址结构,需要include,引用出现这些定义的文本,#include,#include,互联网程序设计,电子科大计算机学院,客户体系结构,客户应用程序比较简单:,不必明显地处理并发性,不需要特权,和常规的应用程序一样执行,不需要强行保护,依赖操作系统自动强迫执行保护,互联网程序设计,电子科大计算机学院,问题:标识效劳器的位置,在编译程序时,将效劳器的域名或者IP地址说明为常量,执行快,但是效劳器移动后不便,要求用户在启动程序时标定效劳器,从稳定的存储设备中获得关于效劳器的信息,如果文件不存在,客户软件就不能执行,使用某个单独的协议来找到效劳器,只能在本地小环境下应用,根据实际情况,综合标识效劳器地址,互联网程序设计,电子科大计算机学院,分析地址参数,参数由字符串构成,客户使用参数语法:,域名方式或IP地址方式,域名和IP地址确实定:扫描参数,看是否含有字母。,全参数化的客户软件允许用户指明协议端口号和机器,使用两个参数:mail.uestc.edu smtp,使用单个参数:mail.uestc.edu:smtp,遵循本地系统的约定:Linux使用单独参数指明效劳器的机器地址和协议端口,互联网程序设计,电子科大计算机学院,查找域名,使用sockaddr_in结构指明效劳器的地址,需要二进制表示的32bit IP地址,套接字对地址转换的支持两个库例程,Inet_addr:IP地址点分十进制到二进制的转换,接受一个点分十进制表示的字符串地址,返回一个等价的二进制地址,Gethostbyname:主机域名到二进制的转换,接受一个机器域名字符串,返回一个hostent结构,内含一个二进制表示的主机IP地址,互联网程序设计,电子科大计算机学院,Hostent,的声明,Struct hostent,char *h_name;/,主机名,char *h_aliases;/,主机别名,int h_addrtype;/,地址类型,int h_length;/,结构长度,char *h_addr_list;/,地址列表,#define h_addr h_addr_list0,互联网程序设计,电子科大计算机学院,调用gethostbyname得到IP地址域名到IP,Struct hostent*hptr;,Char*examplenam=merlin.cs.prudue.edu;,If(hptr=gethostbyname(examplenam),/*IP address is now in hptr-h_addr*/,else,/*error in name-handle it*/,互联网程序设计,电子科大计算机学院,由名字查找某个熟知端口效劳到端口,getservbyname:两个参数指明期望的效劳和协议。返回servent类型的结构指针;,注意网络字节顺序和本地机器的表示方法;,struct servent,char *s_name;,char *s_aliases;,int s_port;,char *s_proto;,;,struct servent*sptr;,if(sptr=getservbyname(“smtp,“tcp),/*port number is now in sptr-s_port*/,else,/*error occurred-handle it*/,互联网程序设计,电子科大计算机学院,由名字查找协议协议到协议的符号常量,getprotobyname:,由协议名返回协议号;返回一个,protoent,类型结构的地址,struct protoent,char *p_name;,char *p_aliases;,char *p_proto;,;,struct protoent*pptr;,if(pptr=getprotobyname(“udp),/*official protocol number is now in pptr-p_proto*/,else,/*error occurred-handle it*/,SOCK_DGRAM,:,UDP,协议,SOCK_STREAM:TCP,协议,互联网程序设计,电子科大计算机学院,TCP,客户算法,-,面向连接的客户,找到期望与之通信的效劳器IP地址和协议端口号,分配套接字socket(),指明此连接需要在本地机器中的、任意的、未使用的协议端口,并允许TCP选择一个这样的端口,将这个套接字连接到效劳器connect(),使用应用级协议与效劳器通信send()/recv(),关闭连接close(),互联网程序设计,电子科大计算机学院,分配套接字,使用socket函数,将协议和效劳分别说明为PF_INET和SOCK_STREAM,include语句包含一些定义常量的文件,对于TCP/IP,第三个参数没有用。,#include,#include,int s;/*socket descriptor*/,s=socket(PF_INET,SOCK_STREAM,0);,互联网程序设计,电子科大计算机学院,选择本地协议端口号,效劳器运行于熟知的端口上,客户不是。,客户使用端口的规那么:,该端口不与该机器其他进程使用端口冲突,该端口没有被分配给某个熟知效劳,客户允许TCP自动选择本地端口,connect调用的一个效果就是所选择的本地端口能够满足上述准那么。,互联网程序设计,电子科大计算机学院,选择本地IP地址的根本问题,对于只挂在一个网络上的主机是简单的,正确的选择依赖于选路信息,但应用程序很少使用选路信息,实际中存在的问题:,一个主机可能具有多个,IP,地址,如果应用程序,随机选择一个,IP,地址,,可能选择了一个与,IP,地址的接口并不匹配的地址。,可能能够正确的工作。但是网络管理会困难和混乱,可靠性降低。,一般本地地址字段不填,允许客户自动选取本地,IP,地址,互联网程序设计,电子科大计算机学院,将TCP套接字连接到效劳器,connect,函数:允许,TCP,套接字发起连接,强迫执行下层的三次握手,超时或者建立连接后返回,三个参数:,retcode=connect(s,remaddr,remaddrlen);,s:,套接字的描述符,remaddr:,一个,sockaddr_in,类型结构的地址,remaddrlen:,第二个参数的长度,connect,的四项任务,对指明的套接字进行检测:有效,没有连接,将第二个参数给出的端点地址填入套接字中,为此套接字选择一个本地端点地址,发起一个,TCP,连接,并返回一个值,互联网程序设计,电子科大计算机学院,使用TCP和效劳器通信,客户发送请求,等待响应,发送请求:,send;,等待响应:,recv;,send(s,req,strlen(req),0);,while(n=recv(s,bptr,buflen,0)0),bptr+=n;,buflen-=n,;,TCP,不保持记录的边界,面向流的概念,互联网程序设计,电子科大计算机学院,关闭,TCP,连接,close:沉着关闭连接释放该套接字,常常需要在客户效劳器之间协调关闭事宜,效劳器不能关闭连接,不知客户请求是否完成,客户不知道效劳器发出的数据是否全部到达,允许应用程序在一个方向关闭TCP连接,shutdown(s,direction);,direction:0不允许输入;1不允许输出;2双向关闭,局部关闭可以让效劳器发送完最后一个响应后,关闭连接。,互联网程序设计,电子科大计算机学院,UDP,客户的编程,找到期望与之通信的效劳器IP地址和协议端口号,分配套接字socket(),指明这种通信需要本地机器中的、任意的、未使用的协议端口,并允许UDP选择一个这样的端口connect(),指明报文所要发往的效劳器sendto(),使用应用级协议与效劳器通信sendto()/recvform(),关闭连接close(),互联网程序设计,电子科大计算机学院,连接和非连接的,UDP,套接字,连接的UDP通信,客户使用connect调用指明远程端点地址,使用SOCK_DGRAM类型的套接字,不发起任何分组交换,不检查远程端点合法性,只是在套接字的数据结构记录远程端点的信息,不用重复指明远端地址收发报文,只和一个效劳器交互比较方便,非连接的UDP通信,在每次发送报文的时候指明远程目的地,使用灵活,便于同不同的效劳器通信,互联网程序设计,电子科大计算机学院,使用UDP和效劳器通信,对于连接的,UDP,套接字,使用,send,发送报文,使用,recv,接收报文,每次,send,发送一个完整的报文,每次,recv,接受一个完整的报文,足够大缓存,不需要重复使用,recv,获得单个报文,对于非连接的,UDP,套接字,sendto:,发送报文,含有地址信息,recvfrom:,接收一个含有源地址的数据报,互联网程序设计,电子科大计算机学院,关闭,UDP,套接字和,UDP,特点,close:关闭套接字,释放与之关联的资源,拒绝以后到达的报文,没有通知远程端点,shutdown:在某个方向上终止进一步传输,不向另外一方发送任何报文,只是在本地套接字标明不期望在指定的方向传输数据,客户关闭输出以后,效劳器并不知道,UDP提供的是不可靠的交互,必须自己设计协议实现可靠性,互联网程序设计,电子科大计算机学院,客户软件例子,通过实例说明客户软件的概念、算法。,例子的特点:,效劳本身所需要的代码很少,易理解,突出根本算法,说明客户/效劳器如何使用系统调用,代码长短和效劳数量的关系,模块化,过程化,隐藏细节:将复杂的程序分解成一组过程,模块化的程序,网络软件含有很多细节,隐藏细节减少出错时机,重用代码,将依赖操作系统的代码隔离,便于移植,互联网程序设计,电子科大计算机学院,针对客户程序的过程库例子,每个客户与效劳器建立联系必须:,选择协议(UDP或TCP),查找效劳器的机器名,查找所期望的效劳并将其映射到协议端口号,分配套接字并与之连接,将这个过程设计为过程库的一局部,只需一次编码。,socket=connectTCP(machine,service);,socket=connectUDP(machine,service);,正确抽象:高级操作,共享代码,减少出错,互联网程序设计,电子科大计算机学院,实现,connectTCP,和,connectUDP,将所有的底层操作放置到,connectsock,中,实现,connectTCP,和,connectUDP,成为简单调用,int connectsock(const char*host,const char*service,const char*transport);,int connectTCP(const char*host,const char*service),/*Arguments,host-name of host to which connection is desired,service service a
展开阅读全文