第5章 MFC WinSock类的编程.ppt

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5.为对话框类添加控件对象事件的响应函数:不变。 6-9步直接去看代码。 三个命令按钮的单击事件完成了4个函数,只剩下p158 void CTalkCDlg::OnReceive()函数和服务器主动断开连接调用的void CTalkCDlg::OnClose()函数。看前面的类与消息驱动的关系图。 由于本程序是直接使用winsock函数而并没有创建MFC的Socket类,故无法使用Socket类对象内置的消息驱动功能,那么客户端在与服务器建立连接后又如何能知道服务器有没有发送数据给它以及这些数据是否到达了呢?假如服务器主动断开了连接,又怎样通知客户端呢? 这里就要用到Windows的异步事件通知,它是建立在Windows消息机制基础上的一种十分重要的编程机制。 刚才上面给出的“连接”按钮的事件过程中有这样一行代码,如下: WSAAsyncSelect(connectsocket,m_hWnd,10000,FD_READ|FD_CLOSE); 这句代码是在客户端发起连接(调用connect()成功)之后使用的,就是用于随时获取服务器发来的数据和感知服务器连接断开事件的。 WSAAsyncSelect()函数是Winsock提供的一个适合于Windows编程的方法,它允许在一个套接字上当发生特定的网络事件时,给Windows网络程序(窗口或对话框)发送一个消息(事件通知),其原型为: Int WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent); 该函数调用成功后返回0,否则返回SOCKET_ERROR. 参数说明如下 S:套接字对象; hWnd:接收消息的窗口句柄; wMsg:传给窗口的消息; lEvent:被注册的网络事件,也是应用程序向窗口发送消息的网络事件,见课本P132. WSAAsyncSelect(connectsocket,m_hWnd,10000,FD_READ|FD_CLOSE); FD_READ:在本程序中就是客户端套接字connectsocket收到服务器发来的数据时得到系统的事件通知。 FD_CLOSE:当服务器主动断开连接(关闭套接字)时,客户端收到的系统通知。 具体应用时,wMsg为在应用程序中定义的消息号(取10000),消息结构中lParam则为以上各种网络事件的名称。因此,可以在窗口处理自定义消息函数中使用如下结构来响应Socket的不同事件: Switch(lParam) { case FD_READ: … break; case FD_CLOSE: … break; … } 本程序就是利用这种事件通知机制编程,从而使客户端套接字能够及时收到服务器发来的数据并对服务器的断开事件做出反应。 具体编程方法: 为主对话框对象添加 PreTranslateMessage()方法,如图 2.使用CAsyncSocket类的ShutDown()成员函数 使用CAsyncSocket类的ShutDown()成员函数,可以选择关闭套接字的方式。将套接字置为不能发送数据,或不能接收数据,或二者均不能的状态。 格式:BOOL ShutDown( int nHow = sends ); 一般说来,调用CAsyncSocket对象的成员函数后,返回一个逻辑型的值,如果成员函数执行成功,返回TRUE;如果失败,返回FALSE。究竟是什么原因造成错误呢?这时,可以进一步调用CAsyncSocket对象的GetLastError()成员函数,来获取更详细的错误代码,并进行相应的处理。 格式: static int GetLastError( ); 返回值是一个错误码,针对刚刚执行的CAsyncSocket成员函数。 5.1.8 错误处理 5.1.9 其它的成员函数 1.关于套接字属性的函数 要设置底层套接字对象的属性,可以调用SetSocketOpt()成员函数; 要获取套接字的设置信息,可调用GetSocketOpt()成员函数; 要控制套接字的工作模式,可调用IOCtl()成员函数,选择合适的参数,可以将套接字设置在阻塞模式(Blocking mode)下工作。 2.发送和接收数据 如果创建的是数据报类型的套接字,用SendTo()成员函数来向指定的地址发送数据,事先不需要建立发送端和接收端之间的连接; 用ReceiveFrom()成员函数可以从某个指定的网络地址接收数据。 发送数据SendTo的调用格式,有

文档评论(0)

a13355589 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档