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,实现 OnReceiveOnClose 函数:

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通信功能的实际应用。

如果需要更详细的步骤或其他功能扩展,可以参考以下文章:

www.cnblogs.com/happykoukou/p/8038701.html

上一篇:MFC中static控件 透明设置
下一篇:MFC不规则窗体

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月29日 23时06分06秒