d074.bmp.txt

来自「Visual C++通信编程工程实例精解(附盘)」· 文本 代码 · 共 40 行

TXT
40
字号
为了便于代码重用,新建一个通用类CServer,封装了服务器的所有操作。声明代码如
#include "winsock.h"
class CServer
{
public:
CServer();
          virtual ~CServer();
public:
           BOOL InitAndListen(HWND hwnd, UINT port);
public:
        SOCKET m_hSocket;
       sockaddr_in m_addr;
        UINT m_uPort;
      HWND m_hWnd;
};
    其中,m_hSocket为SOCKET的句柄,指向创建好的SOCKET; m_addr为服务器地址,
为sockaddrjn结构体变量;m_hWnd为窗口句柄,作为WSAAsyncSelect0函数定义的消息
的窗口的句柄;m_uPort为一个无符号整型,作为IP地址变量。
    CServer类的构造函数将rIl_-hSocket清空,而析构函数—CServer()则调用WSAAsyncSelect()
将InitAndListen()函数内调用该函数设置的几个Socket事件还原为阻塞方式。详细代码见随
书光盘“Chapter 3\Example 4\”。
    该类最重要的函数是hutAndListen0豳数,该函数完成如下功能:
    1) socket0函数创建一个Socket,并将其赋给m_hSocket。
    2)用WSAAsyncSelect0函数在接受、读准备好、写准备好或者关闭时接到通知,实现
这些事件的非阻塞异步处理机制,参数SER_MESSAGE是一个自定义的消息,需要在对应
的窗口编制该消息的响应处理函数,详见CChatRoomDlg内的OnServerMessage(WPARAM
wParam,LPARAM lParam)函数。
    3)用bind0函数绑定一个套接字到本机的地址,其中AF_INET表示本机的任意一个地
址都可以接收Socket消息。这样,就完成了Socket的基本初始化。
    4)用listen()函数开始侦听,等待客户的连接,该函数的第二个参数表示Socket能连接
的最多的客户机的个数。
    请读者注意,由于采用了WSAAsyncSelect0函数,所以在这里可以不必采用多线程连接,
而在Socket对应的窗口内编制一个消息处理函数,完成多个客户机的Socket的连接响应过
程。详细代码如下:
BOOL CServer::InitAndListen(HWND hwnd,  UINT port)
{
m_uPorkport;
 '  m_hWnd=hwnd;
       if(m_hSocket != NULL)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?