C++ 实现一个虚拟聊天软件
程序员文章站
2024-03-18 11:51:34
...
C++ 实现一个虚拟聊天软件
本文使用c++和Qt实现一个虚拟的IM聊天软件,实现消息传递,大文件传输,断点续传等功能,主要功能点包括:
- 用户列表
- 上下线更新列表
- 消息喘息
- *文件传输(支持2GB以上大文件)
- 多文件同时传输
- 断点续传
UDP发送/接收消息
项目中所有关于消息的接收与发送均使用UDP进行,包括上线,下线消息,聊天消息,请求发送文件消息,接受方返回确认发送消息,取消文件发送消息等。
1. UDP广播消息
程序启动时,初始化UDP,并发送广播消息,然后在线程中启动UDP监听,c++ UDP监听具体代码如下(监听采用Select模型,避免阻塞):
{
char buf[1024]; //接收缓冲区
struct timeval tv;
fd_set readfds;
unsigned int n = 0;
while (true)
{
FD_ZERO(&readfds);
FD_SET(m_sockUdp.sockSrv, &readfds);
tv.tv_sec = 1; //设置1s循环
select(m_sockUdp.sockSrv, &readfds, NULL, NULL, &tv); //使用select模型,recvfrom阻塞
Message *msgUDP; //申明结构体对象
if (FD_ISSET(m_sockUdp.sockSrv, &readfds))
{
//接收消息
if ((n = recvfrom(m_sockUdp.sockSrv, buf, sizeof(buf), 0, (SOCKADDR *)&m_sockUdp.sin_from, &m_sockUdp.nAddrLen)) >= 0)
{
msgUDP = (Message *)buf;
switch (msgUDP->messageType)
{
case '0': //处理广播消息
broadcastMsg(msgUDP);
break;
case '1': //收到已登录用户在线消息
onlineMsg(msgUDP);
break;
case '2': //处理私发消息
privateMsg(msgUDP);
break;
case '3': //接收对方发送文件请求
fileMeg(msgUDP);
break;
case '4': //确认发送,创建线程
//启动从len长度开始发送数据
QMetaObject::invokeMethod(m_ui, "createSendFileProcess", Qt::QueuedConnection, Q_ARG(QString, QString(QLatin1String(msgUDP->toAddress))),
Q_ARG(int, 8779),
Q_ARG(QString, QString(QString::fromLocal8Bit(msgUDP->fileName))),
Q_ARG(long long, msgUDP->fileLen),
Q_ARG(QString, QString(QLatin1String(msgUDP->Md5))));
break;
case '5': //接收对方取消发送文件消息
QString fileMd5 = QString(QLatin1String(msgUDP->Md5));
m_ui->mapFileResvProgress[fileMd5]->cancel = true;
break;
}
}
}
}
}
TCP发送/接收文件
后续更新
上一篇: 用栈实现队列(Leetcode)
下一篇: 数据结构_2:栈