MFC-- 互联网编程


Microsoft 提供了许多用于对客户端和服务器应用程序进行编程的 API。许多新的应用程序正在为 Internet 编写,并且随着技术、浏览器功能和安全选项的变化,将会编写新类型的应用程序。您的自定义应用程序可以检索信息并提供 Internet 上的数据。

MFC 提供了一个类CSocket,用于使用Windows Sockets 编写网络通信程序。

以下是 CSocket 类中的方法列表。

先生。 名称和描述
1

将 SOCKET 句柄附加到 CSocket 对象。

2

取消阻止呼叫

取消当前正在进行的阻塞调用。

3

创造

创建一个套接字。

4

句柄

给定 SOCKET 句柄,返回指向 CSocket 对象的指针。

5

正在阻塞

确定阻塞调用是否正在进行。

让我们通过创建 MFS SDI 应用程序来研究一个简单的示例。

MFC服务器

步骤 1 - 在名称字段中输入 MFCServer,然后单击“确定”。

MFC服务器

步骤 2 - 在“高级功能”选项卡上,检查 Windows 套接字选项。

步骤 3 - 创建项目后,添加新的 MFC 类 CServerSocket。

MFC服务器

步骤 4 - 选择 CSocket 作为基类,然后单击完成。

步骤 5 - 添加更多 MFC 类 CReceivingSocket。

MFC服务器

步骤 6 - CRecavingSocket 将接收来自客户端的传入消息。

在 CMFCServerApp 中,头文件包括以下文件 -

#include "ServerSocket.h"
#include "MFCServerView.h"

步骤 7 - 在 CMFCServerApp 类中添加以下两个类变量。

CServerSocket m_serverSocket;
CMFCServerView m_pServerView;

步骤 8 - 在 CMFCServerApp::InitInstance() 方法中,创建套接字并指定端口,然后调用 Listen 方法,如下所示。

m_serverSocket.Create(6666);
m_serverSocket.Listen();

步骤 9 - 在 CMFCServerView 头文件中包含以下头文件。

#include "MFCServerDoc.h"

步骤 10 - 重写 Socket 类中的 OnAccept 函数。

MFC服务器

步骤 11 - 在类视图中选择 CServerSocket 并在属性窗口中选择突出显示的图标。现在,添加 OnAccept。这是OnAccept函数的实现。

void CServerSocket::OnAccept(int nErrorCode) {

   // TODO: Add your specialized code here and/or call the base class
   AfxMessageBox(L"Connection accepted");
   CSocket::OnAccept(nErrorCode);
}

步骤 12 - 添加 OnReceive() 函数。

void CServerSocket::OnReceive(int nErrorCode) { 
   
   // TODO: Add your specialized code here and/or call the base class
   AfxMessageBox(L"Data Received");
   CSocket::OnReceive(nErrorCode);
}

步骤 13 - 在 CReceivingSocket 类中添加 OnReceive() 函数。

在解决方案资源管理器中右键单击 CMFCServerView 类,然后选择添加 → AddFunction。

MFC服务器

步骤 14 - 输入上述信息并单击完成。

步骤 15 - 在 CMFCServerView 头文件中添加以下 CStringArray 变量。

CStringArray m_msgArray;

步骤 16 - 这是 AddMsg() 函数的实现。

void CMFCServerView::AddMsg(CString message) {

   m_msgArray.Add(message);
   Invalidate();
}

步骤 17 - 更新构造函数,如以下代码所示。

CMFCServerView::CMFCServerView() {

   ((CMFCServerApp*)AfxGetApp()) -> m_pServerView = this;
}

步骤 18 - 这是 OnDraw() 函数的实现,它显示消息。

void CMFCServerView::OnDraw(CDC* pDC) {

   int y = 100;
   for (int i = 0; m_msgArray.GetSize(); i++) {
   
      pDC->TextOut(100, y, m_msgArray.GetAt(i));
      y += 50;
   }
   CMFCServerDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

   // TODO: add draw code for native data here
}

步骤 19 - 服务器端现已完成。它将接收来自客户端的消息。

创建客户端应用程序

步骤 1 - 让我们为客户端应用程序创建一个新的基于 MFC 对话框的应用程序。

客户端

客户端

步骤 2 - 在“高级功能”选项卡上,检查 Windows 套接字选项,如上所示。

步骤 3 - 创建项目后,设计对话框,如以下快照所示。

客户端

步骤 4 - 为“连接”和“发送”按钮添加事件处理程序。

步骤 5 - 为所有三个编辑控件添加值变量。对于端口编辑控制,选择变量类型 UINT。

客户端

步骤 6 - 添加用于连接和发送消息的 MFC 类。

客户端

步骤 7 - 将 CClientSocket 类的头文件包含在头文件 CMFCClientDemoApp 类中并添加类变量。同样,也在 CMFCClientDemoDlg 头文件中添加类变量。

CClientSocket m_clientSocket;

步骤 8 - 这是“连接”按钮事件处理程序的实现。

void CMFCClientDemoDlg::OnBnClickedButtonConnect() {

   // TODO: Add your control notification handler code here
   UpdateData(TRUE);
   m_clientSocket.Create();
   if (m_clientSocket.Connect(m_ipAddress, m_port)) {
      AfxMessageBox(L"Connection Successfull");
   }else {
      AfxMessageBox(L"Connection Failed");
   }
   DWORD error = GetLastError();
}

步骤 9 - 这是发送按钮事件处理程序的实现。

void CMFCClientDemoDlg::OnBnClickedButtonSend() {

   // TODO: Add your control notification handler code here
   UpdateData(TRUE);
   if (m_clientSocket.Send(m_message.GetBuffer(m_message.GetLength()), m_message.GetLength())) {
   
   }else {
      AfxMessageBox(L"Failed to send message");
   }
}

步骤 10 - 首先运行服务器应用程序,然后运行客户端应用程序。输入本地主机 IP 和端口,然后单击“连接”。

客户端

步骤 11 - 您现在将在服务器端看到消息,如以下快照所示。

客户端