通信应用软件设计TP7-1.ppt_第1页
通信应用软件设计TP7-1.ppt_第2页
通信应用软件设计TP7-1.ppt_第3页
通信应用软件设计TP7-1.ppt_第4页
通信应用软件设计TP7-1.ppt_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章,超越基本的套接字编程,通信应用软件设计,2,目标,掌握如何获取、设置套接字选项的方法。掌握信号的方式实现进程与进程,系统与进程之间的通信方式。了解套接字编程中非阻塞套接字和异步I/O方式。掌握进程与线程的基本概念和使用方法掌握多路复用了解多播和广播基本概念,3,概述,在前面的章节中我们编写了TCP和UDP通信的基本编程模式,但仅仅这些还不能写出比较完整和实用的通信程序。我们必须将TCP/IP编程的知识进一步融入到Linux操作系统中,例如多任务处理、信号、广播等基本技术。通过本章的学习,可以让我们写出真正的通信应用程序。,4,套接字选项(1),TCP/IP协议的开发者花了大量的时间考虑了可以满足大多数应用程序的默认行为。不过很少有一种“万能式”的设计能够适合各种应用。例如每个套接字都有一个关联的接收缓冲区,它应该是多大?默认值可能并不适合你的应用程序。套接字行为的特定方面均与套接字的选项有关。可以通过修改关联的套接字选项的值,更改套接字的接收缓冲区大小。,5,RFC,RequestForComments(RFC),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。目前RFC文件是由InternetSociety(ISOC)赞助发行。基本的互联网通信协议都有在RFC文件内详细说明。RFC文件还额外加入许多的论题在标准内,例如对于互联网新开发的协议及发展中所有的记录。因此几乎所有的互联网标准都有收录在RFC文件之中。,6,套接字选项(2),函数getsockopt()和setsockopt()分别用于查询和设置套接字选项:intgetsockopt(intsocket,intlevel,intoptName,voidchar*optval,socklen_t*optLen)intsetsockopt(intsocket,intlevel,intoptName,voidchar*optval,socklen_t*optLen),7,8,套接字选项(3),需要注意的是系统不保证传递给setsockopt的值是套接字所设置的新值,某些时候,这些设置的值并不能真正地影响系统的行为。请仔细阅读课文p94页的注意事项。,9,信号(1),信号提供了一种机制,用于通知程序发生了某些事件,例如用户输入了“中断字符”或者计时器到期。当把信号递送到程序时,将发生以下4件事情之一:忽略信号,进程永远不知道信号被递送。程序被操作系统强行终止。程序执行被中断,并且执行程序指定的信号处理例程。信号被阻塞。即阻止信号起到任何作用,直至程序采取行到以允许递送它为止。,10,信号(2),UNIX具有许多不同的信号,每个信号都指示发生了不同类型的事件。每个信号都具有系统定义的默认行为。TCP/IP编程中需要重点关注五种的信号:SIGALRM报警计时器到期SIGCHLD子进程退出SIGINT中断字符(Ctrl+C)输入SIGIO套接字为I/O做好准备SIGPIPE尝试写到关闭的套接字,11,列出Linux中所有信号命令,12,信号(3),应用程序可以使用函数sigaction()更改特定信号的默认行为。intsigaction(intwhichSignal,conststructsigaction*newAction,structsigaction*oldAction)structsigactionvoid(*sa_handler)(int);/信号处理函数sigset_tsa_mask;intsa_flags);,13,信号(4),signaction()函数调用成功返回0,如果失败返回-1。如果指针oldAction不是null,就会把描述给定信号的以前行为的sigaction结构复制给newAction。字段sa_handler的取值SIG_IGN忽略信号SIG_DEF使用信号的默认行为函数地址,该函数有一个整型参数,表示信号值。,14,信号(5),sa_mask被实现为一组布尔值,其中每个标志用于一种信号。字段sa_mask指定处理whichSignal时要阻塞的信号。intsigemptyset(sigset_t*set);intsigfillset(sigset_t*set);intsigaddset(sigset_t*set,intwhichSignal);intsigdelset(sigset_t*set,intwhichSignal);,15,16,17,非阻塞I/O(1),套接字调用的默认行为是:一直阻塞到请求动作完成为止,例如recv函数调用直到接收到消息才会返回。具有被阻塞函数的进程将会被操作系统挂起。带有阻塞型函数的进程面临两个问题:1、如果程序在阻塞期间还要执行其他任务该怎么办,如键盘输入?2、如果从客户端发送的数据报或者来自服务器的应答数据报丢失,等待接收服务器返回信息的客户程序将会无限期阻塞。,18,非阻塞I/O(2),有多种机制可用于控制不想要的阻塞行为:非阻塞套接字异步I/O计时器计时超时处理,19,非阻塞套接字(1),针对不想要的阻塞这个问题一种显而易见的解决方案是:更改套接字的行为,使得所有的调用都是非阻塞的。可以通过调用fcntl函数更改默认的阻塞行为intfcntl(intsocket,intcommand,)非阻塞套接字调用的困难之处在于:无法知道何时调用将会成功,而只能通过周期性的轮询,直到它成功为止。,20,非阻塞套接字(2),对失败而言,需要能够区分由于阻塞而导致的失败与其他类型的失败。如果失败是由于是由于调用被阻塞而发生的,系统就会把errno设置为EWOULDBLOCK,connect除外,它返回的error为EINPROGRESS。,21,异步I/O(1),异步I/O的工作方式是:当套接字上发生某个与I/O相关的事件时,把SIGIO信号传递给进程。处理SIGIO涉及三个步骤:使用sigaction函数通知系统想要如何布置信号使用fcntl,通过使某个进程成为套接字的所有者,确保与套接字相关的信号将被传递给这个进程。再次通过fcntl()设置一个标志(FASYNC),把套接字标记为预先为异步I/O做好准备。,22,异步I/O(2),案例UDPEchoServer-SIGIO.c当没有客户需要应答时,修改过的服务器能够执行其他任务。在创建并绑定套接字之后,服务器无需调用recvfrom并阻塞到数据报到达为止,而是为SIGIO建立一个信号处理程序并开始做其他工作。当数据报到达时,触发处理函数的执行。,23,超时(1),异步I/O是依靠系统来通知程序所发生的与I/O相关的事件,不过当消息丢失时,程序可能永远收不到相关的I/O事件。接收程序不能直接判别是否发生了丢失,因此它会对其将会等待响应多长时间设置一个限制。例如:UDP应答客户可能假定:如果服务器在两秒钟内没有响应它的请求,那么服务器将永远也不会响应。客户对这个两秒钟超时的反应可能是放弃,或者通过重新发送请求再试一次。,24,超时(2),实现超时的

温馨提示

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

评论

0/150

提交评论