欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++ 实现一个虚拟聊天软件

程序员文章站 2024-03-18 11:51:34
...

C++ 实现一个虚拟聊天软件

本文使用c++和Qt实现一个虚拟的IM聊天软件,实现消息传递,大文件传输,断点续传等功能,主要功能点包括:

  • 用户列表
  • 上下线更新列表
  • 消息喘息
  • *文件传输(支持2GB以上大文件)
  • 多文件同时传输
  • 断点续传

UDP发送/接收消息

项目中所有关于消息的接收与发送均使用UDP进行,包括上线,下线消息,聊天消息,请求发送文件消息,接受方返回确认发送消息,取消文件发送消息等。
C++ 实现一个虚拟聊天软件

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发送/接收文件

后续更新

相关标签: C++实现聊天软件