
MFC中Socket网络通讯
发布日期:2025-04-13 23:51:31
浏览次数:11
分类:精选文章
本文共 3514 字,大约阅读时间需要 11 分钟。
UDP与TCP通信在MFC程序中的实现
在现今的网络应用开发中,UDP和TCP协议是两种常用的数据传输协议,各有其适用的场景。本文将详细介绍如何在MFC程序中实现基于UDP和TCP的通信功能,并提供完整的代码示例。
UDP通信实现
1.1 UDP协议概述
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的简单可靠性协议,适用于对实时性要求较高但可靠性要求较低的网络通信场景。与TCP不同,UDP不需要建立连接,数据包的发送和接收是独立的。
1.2 MFC程序的创建
1.2.1 初始化Socket
在MFC程序的主类(如 CMy15_1UDPDlg
)的 OnInitDialog
函数中,初始化Socket:
BOOL CMy15_1UDPDlg::OnInitDialog(){ CDialog::OnInitDialog(); // 设置图标 SetIcon(m_hIcon, TRUE); // 大图标 SetIcon(m_hIcon, FALSE); // 小图标 // 初始化Socket if (!m_sock.Create(8811, SOCK_DGRAM)) // 使用UDP协议 { AfxMessageBox("网络创建失败!"); } // 设置接收端口 m_sock.Bind(NULL, 8811); return TRUE;}
1.2.2 接收UDP消息
创建一个自定义Socket类 CSockU
,继承自 CSocket
,并实现 OnReceive
函数:
void CSockU::OnReceive(int nErrorCode){ char buf[512] = { 0 }; this->ReceiveFrom(buf, sizeof(buf), szIP, nPort); // 获取主对话框引用 CMy15_1UDPDlg* pDlg = (CMy15_1UDPDlg*)AfxGetMainWnd(); pDlg->OnReceive(buf, szIP); CSocket::OnReceive(nErrorCode);}
1.2.3 发送UDP消息
在发送按钮的响应函数中:
void CMy15_1UDPDlg::OnReceive(LPCSTR szText, LPCSTR szIP){ CString str = szIP + ":" + szText; CEdit* pEdit = (CEdit*)GetDlgItem(IDC_HIST); pEdit->ReplaceSel(str);}
TCP通信实现
2.1 TCP协议概述
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的可靠性协议,适用于需要确保数据完整性和顺序传输的场景。
2.2 TCP客户端实现
2.2.1 初始化Socket
在主对话框类中:
void OnReceive(CString szText){ CEdit* pEdit = (CEdit*)GetDlgItem(IDC_HIST); pEdit->ReplaceSel(szText);}
2.2.2 连接服务器
在 OnInitDialog
函数中:
BOOL TCP_ClientDlg::OnInitDialog(){ CDialog::OnInitDialog(); // 设置图标 SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); // 初始化Socket if (!m_sock.Create()) { AfxMessageBox("网络创建失败!"); } if (!m_sock.Connect("192.168.1.118", 8881)) // 服务器IP和端口 { int nErr = GetLastError(); // 10061 错误 AfxMessageBox("连接失败,请检查网络是否连接!"); } return TRUE;}
2.2.3 接收TCP消息
在自定义Socket类 CSockC
中:
void CSockC::OnReceive(int nErrorCode){ char s[2048] = { 0 }; this->Receive(s, sizeof(s)); // 获取IP和端口 GetPeerName(szIP, nPort); // 获取主对话框引用 TCP_ClientDlg* pDlg = (TCP_ClientDlg*)AfxGetMainWnd(); pDlg->OnReceive(s); CSocket::OnReceive(nErrorCode);}
服务器端实现
3.1 服务器Socket类
创建 CListenSocket
类,继承自 CSocket
,实现 OnAccept
函数:
void CListenSocket::OnAccept(int nErrorCode){ CClientSocket* p = new CClientSocket; if (!Accept(*p)) { delete p; return; } // 获取客户端信息 p->GetPeerName(szIP, nPort); // 回调主对话框 ServerDlg* pDlg = (ServerDlg*)AfxGetMainWnd(); pDlg->OnAccept(szIP, nPort); // 将客户端添加到列表中 theApp.m_list.AddTail(p); CSocket::OnAccept(nErrorCode);}
3.2 客户端Socket类
创建 CClientSocket
类,继承自 CSocket
,实现 OnReceive
和 OnClose
函数:
void CClientSocket::OnReceive(int nErrorCode){ char s[2048] = { 0 }; this->Receive(s, sizeof(s)); // 获取IP和端口 GetPeerName(szIP, nPort); // 获取主对话框引用 ServerDlg* p = (ServerDlg*)AfxGetMainWnd(); p->OnReceive(s, szIP, nPort); // 将消息发送所有客户端 POSITION pos = theApp.m_list.GetHeadPosition(); while (pos) { CClientSocket* pSock = theApp.m_list.GetNext(pos); pSock->Send(str, str.GetLength()); } CSocket::OnReceive(nErrorCode);}
3.3 服务器对话框实现
在主对话框类中:
void ServerDlg::OnAccept(CString szIP, UINT nPort){ CString str = szIP + "-" + to_string(nPort) + "已连接"; int nLen = m_txt.GetWindowTextLength(); m_txt.SetSel(nLen, -1); m_txt.ReplaceSel(str);}
完整代码示例
以上代码示例可以在 Visual Studio 中新建项目,基于 MFC 应用程序框架进行编写和调试。通过合理配置IP地址和端口号,可以实现UDP和TCP通信功能的实际应用。
如果需要更详细的步骤或其他功能扩展,可以参考以下文章:
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月29日 23时06分06秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Mesos 资源分配
2025-04-13
message.channel.id Discord PY
2025-04-13
MessageDigest
2025-04-13
Mes的理解
2025-04-13
MES系统如何实现远程访问?
2025-04-13
Metabase RCE漏洞复现(CVE-2023-38646)
2025-04-13
metaclass
2025-04-13
metaq杂记
2025-04-13
Metasploit CGI网关接口渗透测试实战
2025-04-13
Metasploit Framework中最全show命令及使用
2025-04-13
Metasploit GUI图形界面使用
2025-04-13
Metasploit SCADA渗透测试实战
2025-04-13
Metasploit SQL注入漏洞渗透测试实战
2025-04-13
Metasploit Web应用程序漏洞利用实战
2025-04-13
Metasploit Web服务器渗透测试实战
2025-04-13
Metasploit Web认证渗透测试实战
2025-04-13
Metasploit Windows AD渗透测试实战
2025-04-13
Metasploit 信息收集实战
2025-04-13
Metasploit 命令注入漏洞渗透测试实战
2025-04-13