MFC UDP 聊天程序

1. 介绍

UDP: 用户数据包协议(英语:User Datagram Protocol,缩写为UDP),又称用户数据报文协议,是一个简单的面向数据报的传输层协议[1]
采用 UDP 设计聊天程序,实际上是对 Winsocket 函数进行封装。

2. 初步设计

2.1 设计用户数据结构体

数据库端采用 文件 存储用户名,密码等信息。
用户数据结构体 {

// user
typedef struct User{
    char name[20];
    char password[20];
}User;

}

2.2 界面设计

MFC 设计界面和 C# 一样简介 (拖动控件 event由变量控制
MFC UDP 聊天程序_第1张图片

2.3 为控件事件添加处理函数

私聊

把待发送数据包发给指定的用户。
实现方式: 将 pkt 用户名字段 与 用户数据库文件匹配查找,如果找到,则将 pkt.message 发送给该用户

// 用户端 处理私聊
void CChatClientDlg::OnBnClickedButton2()
{
    // TODO:  在此添加控件通知处理程序代码
    UpdateData(TRUE);

    PrivateMsgPkt pkt;
    pkt.header.pktType = PKT_PRIVATE_MSG;
    strcpy(pkt.fromName, (LPCTSTR)m_strUserName);  // 来自
    strcpy(pkt.sendName, (LPCTSTR)m_strTo);               // 去向
    strcpy(pkt.msg, (LPCTSTR)m_strMsg);

    sendto(m_sPeer, (char*)&pkt, 4 + 20 + 20 + m_strMsg.GetLength() + 1, \
        0, (sockaddr*)(&m_peerAddr), sizeof(m_peerAddr));

    char szOutText[1024];

    strcpy(szOutText, pkt.fromName);
    strcat(szOutText, ":   ");
    strcat(szOutText, pkt.msg);

    strcat(szOutText, "\r\n");
    m_editHistoryMsg.SetSel(0, 0);
    m_editHistoryMsg.ReplaceSel(szOutText);
}   

群聊

将 pkt.message 发送给每一位用户

// 用户端处理 群聊
void CChatClientDlg::OnBnClickedButton1()
{
    // TODO:  在此添加控件通知处理程序代码
    UpdateData(TRUE);

    PublicMsgPkt pkt;
    pkt.header.pktType = PKT_PUBLIC_MSG;
    strcpy(pkt.fromName, (LPCTSTR)m_strUserName);
    strcpy(pkt.msg, (LPCTSTR)m_strMsg);

    sendto(m_sPeer, (char*)&pkt, 4 + 20 + m_strMsg.GetLength() + 1,
        0, (sockaddr*)(&m_peerAddr), sizeof(m_peerAddr));

    char szOutText[1024];

    strcpy(szOutText, pkt.fromName);
    strcat(szOutText, ":   ");
    strcat(szOutText, pkt.msg);

    strcat(szOutText, "\r\n");
    m_editHistoryMsg.SetSel(0, 0);
    m_editHistoryMsg.ReplaceSel(szOutText);
}

3. 编程实现

mfc_udp[2]

4. 效果展示

群聊

MFC UDP 聊天程序_第2张图片

私聊

MFC UDP 聊天程序_第3张图片

重复的登录检测

(类似 QQ 不可以在两台计算机同时登录)
MFC UDP 聊天程序_第4张图片

参考资料

[1] udp protocol
[2] HomeMonitor (原始MFC_UDP项目已经不再开源,不过你可以通过HomeMonitor项目,了解网络编程相关的技巧)

(全文完)

你可能感兴趣的:(開源者也)