《互联网程序设计》

上传人:wux****ua 文档编号:16326988 上传时间:2020-09-26 格式:PPT 页数:40 大小:807.50KB
收藏 版权申诉 举报 下载
《互联网程序设计》_第1页
第1页 / 共40页
《互联网程序设计》_第2页
第2页 / 共40页
《互联网程序设计》_第3页
第3页 / 共40页
资源描述:

《《互联网程序设计》》由会员分享,可在线阅读,更多相关《《互联网程序设计》(40页珍藏版)》请在装配图网上搜索。

1、互联网程序设计,第三讲 客户端软件设计 电子科技大学计算机学院 赵洋 ,互联网程序设计,电子科大计算机学院,在程序中使用套接字调用,使用TCP的客户和服务器套接字函数调用序列,互联网程序设计,电子科大计算机学院,套接字调用参数使用的符号常量,UNIX系统提供了预定义的符号常量和数据结构来声明数据和指明参数: 使用何种服务: SOCK_DGRAM: 数据报服务,UDP协议 SOCK_STREAM: 流服务,TCP协议 PF_INET:使用TCP/IP协议族 AF_INET: 使用TCP/IP地址结构 需要include,引用出现这些定义的文本 #include #include ,互联网程序设计

2、,电子科大计算机学院,客户体系结构,客户应用程序比较简单: 不必明显地处理并发性 不需要特权,和常规的应用程序一样执行 不需要强行保护,依赖操作系统自动强迫执行保护,互联网程序设计,电子科大计算机学院,问题:标识服务器的位置,在编译程序时,将服务器的域名或者IP地址说明为常量 执行快,但是服务器移动后不便 要求用户在启动程序时标定服务器 从稳定的存储设备中获得关于服务器的信息 如果文件不存在,客户软件就不能执行 使用某个单独的协议来找到服务器 只能在本地小环境下应用 根据实际情况,综合标识服务器地址,互联网程序设计,电子科大计算机学院,分析地址参数,参数由字符串构成,客户使用参数语法: 域名方

3、式或IP地址方式 域名和IP地址的确定:扫描参数,看是否含有字母。 全参数化的客户软件允许用户指明协议端口号和机器 使用两个参数: smtp 使用单个参数::smtp 遵循本地系统的约定:Linux使用单独参数指明服务器的机器地址和协议端口,互联网程序设计,电子科大计算机学院,查找域名,使用sockaddr_in结构指明服务器的地址 需要二进制表示的32bit IP地址 套接字对地址转换的支持(两个库例程) Inet_addr: IP地址点分十进制到二进制的转换 接受一个点分十进制表示的字符串地址,返回一个等价的二进制地址 Gethostbyname: 主机域名到二进制的转换 接受一个机器域名

4、字符串,返回一个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=”me

5、rlin.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_pro

6、to; ;,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

7、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选择一个这样的端口 将这个套接字连接到

8、服务器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);,互联网程序设计,电子科大计算机学院,选择本地协议端口号,服务器运行于熟知的端口上,客户不是。 客户使用端口的

9、规则: 该端口不与该机器其他进程使用端口冲突 该端口没有被分配给某个熟知服务 客户允许TCP自动选择本地端口 connect调用的一个效果就是所选择的本地端口能够满足上述准则。,互联网程序设计,电子科大计算机学院,选择本地IP地址的基本问题,对于只挂在一个网络上的主机是简单的 正确的选择依赖于选路信息,但应用程序很少使用选路信息,实际中存在的问题: 一个主机可能具有多个IP地址 如果应用程序随机选择一个IP地址,可能选择了一个与IP地址的接口并不匹配的地址。 可能能够正确的工作。但是网络管理会困难和混乱,可靠性降低。 一般本地地址字段不填,允许客户自动选取本地IP地址,互联网程序设计,电子科大

10、计算机学院,将TCP套接字连接到服务器,connect函数:允许TCP套接字发起连接 强迫执行下层的三次握手 超时或者建立连接后返回 三个参数: retcode = connect(s, remaddr, remaddrlen); s: 套接字的描述符 remaddr: 一个sockaddr_in类型结构的地址 remaddrlen: 第二个参数的长度 connect的四项任务 对指明的套接字进行检测:有效,没有连接 将第二个参数给出的端点地址填入套接字中 为此套接字选择一个本地端点地址 发起一个TCP连接,并返回一个值,互联网程序设计,电子科大计算机学院,使用TCP和服务器通信,客户发送请求

11、,等待响应 发送请求: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不

12、允许输入; 1不允许输出; 2双向关闭 部分关闭可以让服务器发送完最后一个响应后,关闭连接。,互联网程序设计,电子科大计算机学院,UDP客户的编程,找到期望与之通信的服务器IP地址和协议端口号 分配套接字socket() 指明这种通信需要本地机器中的、任意的、未使用的协议端口,并允许UDP选择一个这样的端口connect() 指明报文所要发往的服务器sendto() 使用应用级协议与服务器通信sendto()/recvform() 关闭连接close(),互联网程序设计,电子科大计算机学院,连接和非连接的UDP套接字,连接的UDP通信 客户使用connect调用指明远程端点地址 使用SOCK_

13、DGRAM类型的套接字 不发起任何分组交换,不检查远程端点合法性 只是在套接字的数据结构记录远程端点的信息 不用重复指明远端地址收发报文 只和一个服务器交互比较方便 非连接的UDP通信 在每次发送报文的时候指明远程目的地 使用灵活,便于同不同的服务器通信,互联网程序设计,电子科大计算机学院,使用UDP和服务器通信,对于连接的UDP套接字 使用send发送报文 使用recv接收报文 每次send发送一个完整的报文 每次recv接受一个完整的报文,足够大缓存 不需要重复使用recv获得单个报文 对于非连接的UDP套接字 sendto: 发送报文,含有地址信息 recvfrom:接收一个含有源地址的

14、数据报,互联网程序设计,电子科大计算机学院,关闭UDP套接字和UDP特点,close: 关闭套接字,释放与之关联的资源 拒绝以后到达的报文 没有通知远程端点 shutdown: 在某个方向上终止进一步传输 不向另外一方发送任何报文,只是在本地套接字标明不期望在指定的方向传输数据 客户关闭输出以后,服务器并不知道 UDP提供的是不可靠的交互 必须自己设计协议实现可靠性,互联网程序设计,电子科大计算机学院,客户软件例子,通过实例说明客户软件的概念、算法。 例子的特点: 服务本身所需要的代码很少,易理解 突出基本算法 说明客户/服务器如何使用系统调用 代码长短和服务数量的关系 模块化,过程化 隐藏细

15、节: 将复杂的程序分解成一组过程,模块化的程序 网络软件含有很多细节,隐藏细节减少出错机会 重用代码 将依赖操作系统的代码隔离,便于移植,互联网程序设计,电子科大计算机学院,针对客户程序的过程库例子,每个客户与服务器建立联系必须: 选择协议(UDP或TCP) 查找服务器的机器名 查找所期望的服务并将其映射到协议端口号 分配套接字并与之连接 将这个过程设计为过程库的一部分,只需一次编码。 socket = connectTCP(machine, service); socket = connectUDP(machine, service); 正确抽象:高级操作,共享代码,减少出错,互联网程序设计

16、,电子科大计算机学院,实现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

17、associated with the desired port */ return connectsock(host, service, “tcp”); ,互联网程序设计,电子科大计算机学院,实现connectTCP和connectUDP,int connectsock(const char *host, const char *service, const char *transport); int connectUDP(const char *host, const char *service) /* Arguments host-name of host to which connec

18、tion is desired service service associated with the desired port */ return connectsock(host, service, “udp”); ,互联网程序设计,电子科大计算机学院,构成连接的过程,Connectsock:含有所有需要用来分配套接字和连接该套接字的代码(Connectsock.c) #include 语句 宏定义和变量定义,函数声明,功能说明 函数名称和参数说明 局部变量定义 取得端口号,IP地址,和使用协议号 使用socket得到套接字 使用connect建立连接 返回套接字,互联网程序设计,电子科大

19、计算机学院,connectsock说明,复杂条件表达式:函数调用,赋值,比较在一行 memset和memcpy的使用特点 辅助的系统调用:gethostbyname, getprotobyname, getservbyname. errexit.c: 出错退出 int errexit (const char * format, ) va_list args; va_start(args, format); vfprintf(stderr, format, args); va_end(args); exit(1); ,互联网程序设计,电子科大计算机学院,DAYTIME服务,允许用户获得当前的日期

20、和时间 客户程序访问服务器获得信息 格式:weekday,month,day,year,time-timezone 例子:Thursday,February 22,1996 17:3743-PST 可以使用TCP也可以使用UDP实现,协议端口13,互联网程序设计,电子科大计算机学院,DAYTIME服务 可以使用TCP也可以使用UDP实现,对于TCP版本 只要连接到来,服务器就构造包含当前日期时间的文本字符串发送,然后关闭连接。客户不用发送任何数据,发送了也会忽略。,对于UDP版本 服务器收到数据报,格式化当前的日期和时间将结果字符串放置到外发数据报中,发送给客户。激活这个响应的数据报会被丢失。

21、,互联网程序设计,电子科大计算机学院,针对DAYTIME的TCP客户实现,TCPdaytime.c 的实现说明。 #include语句 变量、恒量和函数定义 客户程序主函数main,含参数 int main (int argc, char *argv) 对参数的个数进行判断,根据参数数量的不同进行不同的参数处理 如果出错,提示使用方法,退出 调用TCPdaytime( )获得服务器服务 使用connectTCP得到套接字 循环等待服务器的响应,并送到标准文件显示,互联网程序设计,电子科大计算机学院,从TCP连接中进行读,TCP提供流式服务,不保持记录边界 发送应用程序和接收应用程序分开了 发送

22、2个64字节,可能接收1次或者3次完成 一次TCP连接的读操作调用返回的字节数依赖于下层互联网络数据报的大小,可用的缓存空间,以及穿越网络所遇到的时延。 必须要重复地调用recv(或者read),直到获得所有的数据 TCP的流服务不能保证按写入时相同的数据块交付数据,互联网程序设计,电子科大计算机学院,TIME服务,允许一台机器从另外一台机器获得日期和时间。 由于存在不同的时区,所有的时间日期信息必须用国际标准时间:UCT或UT 服务器应答前将本地时间转化为标准时间 客户收到应答时,将国际标准时间转化为本地时间。 TIME协议规定由32bit的整数来表示 从1990年1月1日午夜为起点的秒数

23、用于一台计算机使用另外一系统时钟来设置起事件,互联网程序设计,电子科大计算机学院,访问TIME服务,TIME服务使用端口37 可以使用TCP协议 使用TCP的TIME服务器利用连接的出现激活输出,类似DAYTIME服务。 使用TCP的客户不用发送任何数据 也可以使用UDP访问TIME服务 客户发出包含单个数据报的请求 服务器从传入的数据报中取出地址和端口号 服务器将当前时间编码为一个整数,使用上述地址和端口号发回给客户,互联网程序设计,电子科大计算机学院,精确时间和网络时延,由于网络时延,客户收到的时间慢了 尽管有更加复杂的协议来处理时钟同步 TIME协议因为简单,在局域环境中,在某些环境下,

24、还是使用很多。 改进TIME协议提高精确性 计算服务器到客户的网络时延近似值 客户计算从客户到服务器,再从服务器到客户的往返时延,取其一半作为时延的近似值。,互联网程序设计,电子科大计算机学院,针对TIME服务的UDP客户,UDPtime.c 程序说明: 变量定义 程序参数处理 建立UDP套接字 发送一个数据报 读取数据报 字节顺序转换, 换算成unix的时间起点 调用ctime转换成为可以读出的时间格式,互联网程序设计,电子科大计算机学院,ECHO服务,ECHO服务器返回从客户收到的所有数据 用户网络管理员测试可达性,调试协议软件,识别选路问题等 TCP ECHO服务:接收连接请求,从连接中

25、读取数据,在该连接上将数据写回。直到客户终止传送。 UDP ECHO服务:接收整个数据报,根据数据报指明的端口号和地址,返回整个数据报,互联网程序设计,电子科大计算机学院,针对ECHO的TCP客户,TCPecho.c 客户主函数:main( ) 处理传入参数 TCPecho( ) 打开连接以后,进入循环 读出每行输入 通过TCP连接发送给ECHO服务器 读取返回的数据并打印 读出过程是一个循环,按照字符数量计数 完成所有的行输入后,程序退出,互联网程序设计,电子科大计算机学院,针对ECHO服务的UDP客户,UDPecho.c 同前面的TCP版本类似 读出返回数据的过程不同,只需要读出一次 UDP客户要么收到了由服务器返回的整个行,要么什么都没有收到。 除非出现差错,否则每次调用read都返回整个行,互联网程序设计,电子科大计算机学院,小结,过程抽象:易于维护,隐藏细节,移植 构造两个过程的例子: connectTCP connectUDP 给出几个客户应用的例子 DAYTIME:得到当日可读格式的时间 TIME:得到32比特整数形式的时间 ECHO: 测试网络联通性,

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


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