,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,计算机通信与网络编程,电子科大计算机学院,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,计算机通信与网络编程,电子科大计算机学院,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,计算机通信与网络编程,电子科大计算机学院,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,计算机通信与网络编程,电子科大计算机学院,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,计算机通信与网络编程,电子科大计算机学院,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,计算机通信与网络编程,电子科大计算机学院,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,计算机通信与网络编程,电子科大计算机学院,*,计算机网络编程,第五讲 客户软件设计中的算法和问题,计算机网络编程第五讲 客户软件设计中的算法和问题,1,应用程序如何发起通信成为客户,应用程序如何使用,TCP,或,UDP,与服务器联系,应用程序如何使用套接字调用与协议交互,计算机网络编程,电子科大计算机学院,目录,应用程序如何发起通信成为客户计算机网络编程电子科大计算机学院,2,应用程序必须指明的细节,客户还是服务器,端点地址,使用面向连接的还是无连接的,如何执行授权和防护准则,所需要的缓存的大小等,只需要概念性地了解套接字,API,需要详细了解构造通信程序的各种方法,便于迅速作出设计决策。,电子科大计算机学院,需要考虑的问题,计算机网络编程,应用程序必须指明的细节电子科大计算机学院需要考虑的问题计算机,3,客户应用程序比较简单:,不必明显地处理并发性,不需要特权,和常规的应用程序一样执行,不需要强行保护,依赖操作系统自动强迫执行保护,电子科大计算机学院,客户体系结构,计算机网络编程,客户应用程序比较简单:电子科大计算机学院客户体系结构计算机网,4,在编译程序时,将服务器的域名或者,IP,地址说明为常量,执行快,但是服务器移动后不便,要求用户在启动程序时标定服务器,使用机器名,不必重新编译客户程序,从稳定的存储设备中获得关于服务器的信息,如果文件不存在,客户软件就不能执行,使用某个单独的协议来找到服务器,(,如广播或组播,),只能在本地小环境下应用,实际:用户在调用客户软件时指明服务器地址,根据实际情况,综合标识服务器地址,电子科大计算机学院,标识服务器的位置的几种方式,计算机网络编程,在编译程序时,将服务器的域名或者IP地址说明为常量电子科大计,5,客户程序调用时常指明参数,客户使用,参数语法,:,域名方式或,IP,地址方式,域名和,IP,地址的确定:扫描参数,看是否含有字母。,全参数化的客户软件允许用户指明协议端口号和机器,使用两个参数:,mail.uestc.edu smtp,使用单个参数:,mail.uestc.edu:smtp,遵循本地系统的约定:,linux,使用单独参数指明服务器的机器地址和协议端口,电子科大计算机学院,分析地址参数,计算机网络编程,客户程序调用时常指明参数,客户使用参数语法:电子科大计算机学,6,使用,sockaddr_in,结构指明服务器的地址,需要二进制表示的,32bit IP,地址,套接字对地址转换的支持,(两个,库例程,),inet_addr:,IP,地址点分十进制的字符串到二进制的转换,接受一个点分十进制表示的字符串的地址,返回一个等价的二进制的地址,gethostbyname:,主机域名到二进制的转换,接受一个机器域名字符串,返回一个,hostent,结构,内含一个二进制表示的主机,IP,地址,电子科大计算机学院,查找域名,计算机网络编程,使用sockaddr_in结构指明服务器的地址电子科大计算机,7,struct sockaddr_in sock;,sock.sin_addr.s_addr=inet_addr(“192.168.0.1”);,/,接受一个点分十进制表示的字符串的地址,返回一个等价的二进制的地址,电子科大计算机学院,IP,地址点分十进制字符串到二进制的转换,TCP/IP,的地址定义,struct sockaddr_in,u_char sin_len;,u_short sin_family,;,u_short sin_port,;,/2B,struct in_addr sin_addr;/4B,char sin_zero8;/8B,IP,专用的结构,计算机网络编程,struct sockaddr_in sock;sock,8,hostent,在文件,netdb.h,的定义,struct hostent,char*h_name;,char *h_aliases;,inth_addrtype;,inth_length;,char*h_addr_list;,;,#define h_addr h_addr_list0,h_addr,指向主机地址表第一个,位置,电子科大计算机学院,查找域名,客户使用,gethostbyname,struct hostent *hptr;,char*exname=“mail.sina;,If(hptr=gethostbyname(exname),/*IP address is now in,hptr-h_addr*/,else,/*error in name-handle it*/,计算机网络编程,hostent在文件netdb.h的定义电子科大计算机学院查,9,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*/,计算机网络编程,getservbyname:两个参数指明期望的服务和协议。,10,getprotobyname:,由协议名返回协议号;返回一个,protoent,类型结构的地址,电子科大计算机学院,由名字查找协议,struct protoent,char *p_name;,char *p_aliases;,int p_proto;,;,struct protoent*pptr;,if(pptr=getprotobyname(“udp”),/*official protocol number is now in pptr-p_proto*/,else,/*error occurred-handle it*/,计算机网络编程,getprotobyname:由协议名返回协议号;返回一个,11,找到期望与之通信的服务器,IP,地址和协议端口号,分配套接字,指明此连接需要在本地机器中的、任意的、未使用的协议端口,并允许,TCP,选择一个这样的端口,将这个套接字连接到服务器,使用应用级协议与服务器通信,关闭连接,电子科大计算机学院,TCP,客户算法,-,面向连接的客户,计算机网络编程,找到期望与之通信的服务器IP地址和协议端口号电子科大计算机学,12,使用,socket,函数,将协议和服务分别说明为,PF_INET,和,SOCK_STREAM,include,语句包含一些定义常量的文件,对于,TCP/IP,,第三个参数没有用。,电子科大计算机学院,分配套接字,#include,#include,int s;/*socket descriptor*/,s=socket(PF_INET,SOCK_STREAM,0);,计算机网络编程,使用socket函数电子科大计算机学院分配套接字#inclu,13,服务器运行于熟知的端口上,客户不是。,客户使用端口的规则:,该端口不与该机器其他进程使用端口冲突,该端口没有被分配给某个熟知服务,客户允许,TCP,自动选择本地端口,connect,调用的一个效果就是所选择的本地端口能够满足上述准则。,电子科大计算机学院,选择本地协议端口号,计算机网络编程,服务器运行于熟知的端口上,客户不是。电子科大计算机学院选择本,14,对于只挂在一个网络上的主机是简单的,正确的选择依赖于选路信息,但应用程序很少使用选路信息,实际中存在的问题:,一个主机可能具有多个,IP,地址,如果应用程序随机选择一个,IP,地址,可能选择了一个与,IP,地址的接口并不匹配的地址。,可能能够正确的工作。但是网络管理会困难和混乱,可靠性降低。,一般本地地址字段不填,允许,TCP/IP,自动选取本地,IP,地址,电子科大计算机学院,选择本地,IP,地址的基本问题,计算机网络编程,对于只挂在一个网络上的主机是简单的电子科大计算机学院选择本地,15,connect,函数:允许,TCP,套接字发起连接,强迫执行下层的三次握手,超时或者建立连接后返回,三个参数:,retcode=connect(s,remaddr,remaddrlen);,s:,套接字的描述符,remaddr:,一个,sockaddr_in,类型结构的地址,remaddrlen:,第二个参数的长度,connect,的四项任务,对指明的套接字进行检测:有效,还没有连接,将第二个参数给出的端点地址填入套接字中,为此套接字选择一个本地端点地址,发起一个,TCP,连接,并返回一个值,电子科大计算机学院,将,TCP,套接字连接到服务器,计算机网络编程,connect函数:允许TCP套接字发起连接电子科大计算机学,16,客户发送请求,等待响应,发送请求:,send;,等待响应:,recv;,send(s,req,strlen(req),0);,while(n=recv(s,bptr,buflen,0)0),bptr+=n;,buflen-=n,;,TCP,不保持记录的边界,面向流的概念,多次接收。,原因,:大块数据被分片封装发送,或由于接收方接收缓冲小而数据被发方分次发送,电子科大计算机学院,使用,TCP,和服务器通信,计算机网络编程,客户发送请求,等待响应电子科大计算机学院使用TCP和服务器通,17,close,:从容关闭连接释放该套接字,常常需要在客户服务器之间,协调,关闭事宜,服务器不能关闭连接,不知客户请求是否完成,客户不知道服务器发出的数据是否全部到达,允许应用程序在一个方向关闭,TCP,连接,shutdown(s,direction);,direction:0,不允许输入,;1,不允许输出,;2,双向关闭,部分关闭可以让服务器发送完最后一个响应后,关闭连接。,电子科大计算机学院,关闭,TCP,连接,计算机网络编程,close:从容关闭连接释放该套接字电子科大计算机学院关闭T,18,找到期望与之通信的服务器,IP,地址和协议端口号,分配套接字,指明这种通信需要本地机器中的、任意的、未使用的协议端口,并允许,UDP,选择一个这样的端口,指明报文所要发往的服务器,使用应用级协议与服务器通信,关闭连接,电子科大计算机学院,UDP,客户的编程,计算机网络编程,找到期望与之通信的服务器IP地址和协议端口号电子科大计算机学,19,连接的,UDP,通信,客户使用,connect,调用指明远程端点地址,使用,SOCK_DGRAM,类型的套接字,不发起任何分组交换,不检查远程端点合法性,只是在套接字的数据结构记录远程端点的信息,不用重复