- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
TCP/IP协议与网络编程 信息科学与工程学院 王霞 博客: /user_index.php?action=addblog_new 公共邮箱:uzzcomnet@163.com 密码:uzzcomnet2013 第8章 高级Socket编程技术(2) 信息科学与工程学院 王霞 本讲内容 学习目标 掌握基于Select模型的编程方法 掌握基于WSAAsyncSelect模型的编程方法 复习 非阻塞编程有何优缺点? 非阻塞socket编程 如何建立一对多的通信? ----多线程 多线程用法 在accept()接收一个连接之后,建立一个新线程。 DWORD dwThreadid; CreateThread(null,null,AnswerThread,(LPVOID)sClient,0,dwThread); DWORD WINAPI AnswerThread(LPWOID lparam) { } 本节任务 Socket有哪些编程模型,他们的作用分别是什么?有何区别? 如何完成Select模型下得编程工作? 如何构建一个完整的Select模型下的套接字程序? Section1 Socket有哪些编程模型,他们的作用分别是什么?有何区别? select(?)函数 int select( int nfds, fd_set FAR* readfds, fd_set FAR* writefds, fd_set FAR* exceptfds, const struct timeval FAR* timeout ); 1. fd_set #define FD_SETSIZE 64 typedef struct fd_set { u_int fd_count; //套接字数量 SOCKET fd_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.Timeval struct timeval { long tv_sec; //秒 long tv_usec; //豪秒 }; timeval结构体用于定义select()函数的等待时间。 tv_sec字段以秒为单位指定该函数的等待时间。 tv_usec字段则以毫秒为单位指定该函数的等待时间。 如果在调用select(?)函数时将等待时间tv_sec和tv_usec都设置为0,则select(?)调用在检查完套接字描述符后立即返回,这可用于探询所选套接字的状态。出于对性能方面的考虑,
文档评论(0)