MFC - Internet 互联网编程
Microsoft 提供了许多用于对客户端和服务器应用程序进行编程的 API。 许多新的应用程序正在为 Internet 编写,并且随着技术、浏览器功能和安全选项的变化,将会编写新类型的应用程序。 您的自定义应用程序可以检索信息并在 Internet 上提供数据。
MFC提供了一个类CSocket,用于使用Windows Sockets编写网络通信程序。
这里是 CSocket 类中的方法列表。
序号 | 名称和描述 |
---|---|
1 | Attach 将 SOCKET 句柄附加到 CSocket 对象。 |
2 | CancelBlockingCall 取消当前正在进行的阻塞调用。 |
3 | Create 创建一个套接字。 |
4 | FromHandle 给定 SOCKET 句柄,返回指向 CSocket 对象的指针。 |
5 | IsBlocking 确定阻塞调用是否正在进行。 |
让我们通过创建 MFS SDI 应用程序来研究一个简单的示例。
步骤 1 − 在名称字段中输入 MFCServer,然后单击"确定"。
步骤 2 − 在"高级功能"选项卡上,选中"Windows 套接字"选项。
步骤 3 − 创建项目后,添加一个新的 MFC 类 CServerSocket。
步骤 4 − 选择 CSocket 作为基类并单击 Finish。
步骤 5 − 添加更多 MFC 类 CReceivingSocket。
步骤 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 函数。
步骤 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 类并选择 Add → AddFunction。
步骤 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 − 为"Connect"连接和"Send "发送按钮添加事件处理程序。
步骤 5 − 为所有三个编辑控件添加值变量。 对于端口编辑控件,选择变量类型 UINT。
步骤 6 − 添加用于连接和发送消息的 MFC 类。
步骤 7 − 在头文件CMFCClientDemoApp类中包含CClientSocket类的头文件,并添加类变量。 同样,也在 CMFCClientDemoDlg 头文件中添加类变量。
CClientSocket m_clientSocket;
步骤 8 − 这是"Connect"连接按钮事件处理程序的实现。
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 和端口,然后单击"Connect"连接。
步骤 11 − 您现在将在服务器端看到该消息,如以下快照所示。