📄 d074.bmp.txt
字号:
为了便于代码重用,新建一个通用类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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -