高级Socket编程技术_第1页
高级Socket编程技术_第2页
高级Socket编程技术_第3页
高级Socket编程技术_第4页
高级Socket编程技术_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

TCP/IP协议与网络编程

信息科学与工程学院王霞博客:/user_index.php?action=addblog_new公共邮箱:uzzcomnet@163.com密码:uzzcomnet2013第8章 高级Socket编程技术(2)信息科学与工程学院王霞8.2基于Select模型的socket编程本讲内容12基于Select模型的socket编程基于WSAAsyncSeclect的socket编程学习目标掌握基于Select模型的编程方法掌握基于WSAAsyncSelect模型的编程方法

复习非阻塞编程有何优缺点?非阻塞socket编程如何建立一对多的通信?

----多线程多线程用法在accept()接收一个连接之后,建立一个新线程。DWORDdwThreadid;CreateThread(null,null,AnswerThread,(LPVOID)sClient,0,&dwThread);DWORDWINAPIAnswerThread(LPWOID

lparam){}本节任务Socket有哪些编程模型,他们的作用分别是什么?有何区别?如何完成Select模型下得编程工作?如何构建一个完整的Select模型下的套接字程序?Section1Socket有哪些编程模型,他们的作用分别是什么?有何区别?Q1:Socket有哪些编程模型,他们的作用分别是什么?有何区别?1-1socket有哪些编程模型?他们的作用分别是什么?

Select模型:

WSAAsyncSelect模型:

WSAEventSelect模型: 重叠I/O模型: 完成端口模型:

Q1:Socket有哪些编程模型,他们的作用分别是什么?有何区别?1-2Select模型有何作用?

Select模型:select( )函数

intselect(

int

nfds,

fd_setFAR*readfds,

fd_setFAR*writefds,

fd_setFAR*exceptfds, conststruct

timevalFAR*timeout );函数参数说明nfds:传入参数,本参数被忽略,仅起到与 BerkeleyAPI套接字兼容的作用。readfds:具有可读性套接字集合的指针。writefds:具有可写性套接字集合的指针。exceptfds:检查错误套接字集合的指针。timeout:用于设置调用select()函数时的等待 时间。1.fd_set#defineFD_SETSIZE64typedef

struct

fd_set{

u_int

fd_count;//套接字数量

SOCKETfd_array[FD_SETSIZE];//套接字数组}fd_set;fd_set

是一个管理多个套接字的结构体。在该结构体中,fd_count

字段指明套接字的数量,fd_array

字段保存fd_count

个套接字。fd_set

最多可以管理64个套接字。 当select()函数成功返回后,会在fs_set

结构中,返回刚好未完成I/O操作的所有套接字句柄的总量。

readfds参数将包含符合下面任何一个条件的套接字。有数据可以读入。此时在该套接字上调用recv()等输入函数,立即接收到对方的数据。连接已经关闭、重设或中止。假如已经调用listen()函数,而且一个连接正在建立。那么此时调用accept()函数会成功。

writefds参数将包含符合下面任何一个条件的套接字。有数据可以发出。此时在该套接字上可以调用send()等输出函数,向对方发送数据。如果已经在一个非阻塞套接字上调用connect()函数,此时连接成功。

exceptfds参数将包含符合下面一个条件的套接字。如果已经在一个非阻塞套接字上调用了connect()函数,此时连接失败。有带外(Out-of-band,OOB)数据可供读取。例:应用程序欲判断某个套接字是否存在可读的数据,需要进行如下步骤。⑴将该套接字加入readfds集合。⑵以readfds为第二个参数调用select()函数。⑶当select()函数返回时,应用程序判断该套接字是否仍然存在于readfds集合。⑷如果该套接字存在于readfds集合,则表明该套接字可读。此时,应用程序调用recv()等输入函数接收数据。调用select()函数时,readfds、writefd和sexceptfds3个参数中至少有一个不能设置为NULL。并且,在该非空的参数中,必须至少包含一个套接字。否则select()函数将没有任何套接字可以等待。不管由于什么原因,假如select()函数调用失败,都会返回SOCKET_ERROR错误代码。注意:2.Timevalstruct

timeval{longtv_sec; //秒

longtv_usec; //豪秒};timeval结构体用于定义select()函数的等待时间。tv_sec字段以秒为单位指定该函数的等待时间。tv_usec字段则以毫秒为单位指定该函数的等待时间。如果在调用select( )函数时将等待时间tv_sec和tv_usec都设置为0,则select( )调用在检查完套接字描述符后立即返回,这可用于探询所选套接字的状态。出于对性能方面的考虑,应避免这样的设置。如果在调用select( )函数时将timeout指向NULL,则进行阻塞等待,即被监视的描述符中只有当其中的任何一个准备好读写操作时,select( )调用才返回。如果等待时间tv_sec和tv_usec不全为0,则当等待时间没有超时时,select( )函数在被检查的描述符中有任何一个套接字准备好读写时返回。注意:3.宏为了方便开发者的使用,WindowsSockets提供了下列宏,可用来针对I/O活动,对fd_set结构进行处理与检查。

FD_CLR(s,*set),从set集合中删除s套接字

FD_ISSET(s,*set),检查s是否为set集合的一名成员。如果s是set集合的一旬成员,则返回TRUE。

FD_SET(s,*set),将套接字s加入set集合。

FD_ZERO(*set),将set集合初始化为空集合。4.调用select()函数时使用宏在开发WindowsSockets应用程序中,通过下面步骤,完成对套接字的可读可写判断。⑴使用FD_ZERO宏,初始化自己感兴趣的套接字集合fd_set。例如FD_ZERO(readfd)。⑵使用FD_SET宏,将套接字分配给参与操作的fd_set集合。例如FD_SET(s,readfd)。⑶以该fd_set为参数调用select()函数。等待在指定的fd_set集合中,I/O活动设置好这个套接字。Select()完成后会返回在所有fd_set集合中设置的套接字句柄总数,并对每个集合进行相应的更新。⑷select()函数成功返回后,使用FD_ISSET宏,对每个fd_set集合进行检查。例如,FD_ISSET(s,readfd)。如果该宏的值为TRUE,则说明该套接字可读。⑸调用相应的WindowsSocketsAPI进行数据的接收和发送。Select模型的优势和不足Select模型优势在于可以同时对多个建立起来的套接字进行有序的管理。可以防止应用程序在一次I/O调用过程中,使阻塞模式套接字被迫进入阻塞状态;使非阻塞套接字产生WSAEWOULDBLOCK错误。Select()函数就好像是一个消息中心,当消息到来时,通知应用程序接收和发送数据,这使得WindowsSockets应用程序开发人员可以把精力更多地集中在如何处理数据的发送和接收上。完成一次I/O操作经历了两次WindowsSockets函数的调用。例如,当接受对方的数据时,第一步,调用Select()函数等待该套接字的满足条件。第二步,调用recv()函数接收数据。这种结果与一个阻塞模式的套接字上调用recv()函数是一样的。使用Select()函数的WindowsSockets程序,其效率可能受损。因为,每一个WindowsSocketsI/O调用都会经过该函数,因而会导致严重的CPU额外负担。在CPU的使用率不是关键因素时,这种效率可以接受。但是,当需要高效率时,肯定会产生问题。Section2如何完成Select模型下得编程工作?

Q2:如何完成Select模型下得编程工作?几个重要的函数WSASocket()WSARecv()WSASend()WSARecv()int

WSARecv(

SOCKETs,//当然是投递这个操作的套接字

LPWSABUFlpBuffers,//接收缓冲区,与Recv函数不同

//这里需要一个由WSABUF结构构成的数组

DWORDdwBufferCount,//

数组中WSABUF结构的数量

LPDWORDlpNumberOfBytesRecvd,//如果接收操作立即完成,这里会返回函数调用所接收到的字节数

LPDWORDlpFlags,//指向标志位的指针

LPWSAOVERLAPPEDlpOverlapped,//“绑定”的重叠结构

LPWSAOVERLAPPED_COMPLETION_ROUTINElpCompletionRoutine

//完成例程中将会用到的参数,我们这里设置为NULL

);

WSASend()int

WSASend(SOCKETs,LPWSABUFlpBuffersDWORDdwBufferCount,LPDWORDlpNumberOfBytesSent,DWORDdwFlags,LPWSAOVERLAPPEDlpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINElpCompletionRoutine);s:标识一个已连接套接口的描述字。lpBuffers:一个指向WSABUF结构数组的指针。每个WSABUF结构包含缓冲区的指针和缓冲区的大小。dwBufferCount:lpBuffers数组中WSABUF结构的数目。lpNumberOfBytesSent:如果发送操作立即完成,则为一个指向所发送数据字节

温馨提示

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

评论

0/150

提交评论