UDP: 用户数据包协议(英语:User Datagram Protocol,缩写为UDP),又称用户数据报文协议,是一个简单的面向数据报的传输层协议[1]
采用 UDP 设计聊天程序,实际上是对 Winsocket 函数进行封装。
数据库端采用 文件 存储用户名,密码等信息。
用户数据结构体 {
// user
typedef struct User{
char name[20];
char password[20];
}User;
}
MFC 设计界面和 C# 一样简介 (拖动控件 event由变量控制)
把待发送数据包发给指定的用户。
实现方式: 将 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);
}
mfc_udp[2]
[1] udp protocol
[2] HomeMonitor (原始MFC_UDP项目已经不再开源,不过你可以通过HomeMonitor项目,了解网络编程相关的技巧)
(全文完)