现在的位置: 首页 > 综合 > 正文

孙鑫VC学习笔记:第十六讲 (三) 用异步套接字编写聊天程序

2013年10月15日 ⁄ 综合 ⁄ 共 1456字 ⁄ 字号 评论关闭

基于消息的异步套接字
 Windows套接字在两种模式下执行I/O操作,阻塞和非阻塞。在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数会一直等待下去,不会立即返回程序(将控制权交还给程序)。而在非阻塞模式下,Winsock函数无论如何都会立即返回。
 Windows Sockets为了支持Windows消息驱动机制,使应用程序开发者能够方便地处理网络通信,它对网络事件采用了基于消息的异步存取策略。
 Windows Sockets的异步选择函数WSAAsyncSelect()提供了消息机制的网络事件选择,当使用它登记的网络事件发生时,Windows应用程序相应的窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。

--------------------------------------------------------------------------------
用异步套接字编写一个基于MFC对话框的聊天程序:
1.新建一个基于MFC项目工程Chat,如下

2.加载套接字库,有下面两种方法,上一讲中我们用的是AfxSocketInit()加载套接字库,但是只能加载1.1版本的套接字库。今天我们使用WSAStartup()加载套接字库版本2。
 1)在预编译头文件中包含头文件:winsock2.h(不是Afxsock.h)
 2)链接库文件ws2_32.lib,如果不链接将会编译链接出错
 3)在CChatApp::InitInstance()函数中加载套接字库版本2
 
 4)为CChatApp增加析构函数,调用WSACleanup()来终止对套接字库的使用。
 Windows中增加的扩展函数都会在前面加上前缀WSA。
--------------------------------------------------------------------------------
3.初始化套接字,
 1)在CChatDlg类中添加成员变量SOCKET m_socket;
     在构造函数中初始化变量m_socket;在析构函数中调用closesocket(m_socket)关闭套接字。
 2)添加初始化套接字库的成员函数BOOL InitSocket();
  步骤如下:
  1。新建套接字
  2。新建地址。
  3。绑定
  4。请求一个windows的基于消息的网络事件通知
  5。在BOOL CChatDlg::OnInitDialog()中调用BOOL CChatDlg::InitSocket()
--------------------------------------------------------------------------------4.编写接收端程序
  自定义消息响应函数步骤:
 1)在ChatDlg.h中定义#define UM_SOCK  WM_USER+1
 2)消息原型声明
 3)在添加消息映射
 4)实现消息响应函数
--------------------------------------------------------------------------------
5.编写发送端程序
最后为按钮添加消息实现代码:
注意,
 此程序的接收端和发送端是在同一个线程下完成的,
 如果我们采用阻塞套接字会因为接收函数的调用而使主线程暂停运行。
 这样我们采用异步选择的机制完成了主线程的接收端和发送端,
 而不需要用多个线程,这个可以提高程序的性能。
  

抱歉!评论已关闭.