MIDSUMMER_yy 2018-08-12 13:59 采纳率: 66.7%
浏览 1746
已采纳

用QT的UDP广播通讯,向同一个局域网的其他主机发送自己的ip地址,用控制台的方式实现,不要窗口

就是连在同一个路由器的所有主机上都跑一下这个QT程序,然后每台主机都向其他主机UDP广播
发送自己的ip地址,这个建立的工程文件是QT Console Application,也就是不要用到
窗口的任何东西,只在控制台这个黑框框里显示结果就行了,麻烦大佬给代码的时候给一下
注释,就给一下cpp里的代码就好,分客户端和服务端,万分感谢。

  • 写回答

2条回答 默认 最新

  • kof98765 2018-08-28 04:18
    关注

    LiveServer::LiveServer(Analysis *p):Analysis(p)
    {
    udp=new QUdpSocket;
    connect(&timer,SIGNAL(timeout()),this,SLOT(broadcastInfo()));
    timer.start(30000);
    }
    void LiveServer::setPort(int port, QString settings, HANDLE d)
    {

    das=(SysInfo*)d;
    udp->bind(IPMSG_DEFAULT_PORT);
    connect(udp,SIGNAL(readyRead()),this,SLOT(readReady()));
    broadcastInfo();
    

    }
    void LiveServer::broadcastInfo()//客户端调用此函数广播
    {
    SearchCommand com;
    initCommand(&com);
    char buf[COM_LENGTH];
    memset(buf,0,sizeof(buf));
    com.commandNo=IPMSG_BR_ENTRY;
    com.describe=das->getSettings("describe");
    com.hardVersion=das->getSettings("hardVersion");
    com.softVersion=das->getSettings("softVersion");
    com.sysLocation=das->getSettings("sysLocation");
    com.name=das->getSettings("name");
    com.product=das->getSettings("product");
    com.uuid=das->getSettings("uuid");
    com.ipAddr=das->getSettings("ipAddr");
    com.mac=das->getSettings("mac");
    com.mask=das->getSettings("mask");
    com.dns1=das->getSettings("dns1");
    com.dns2=das->getSettings("dns2");
    com.ipAddrMethod=das->getSettings("dynamic_static_ipmethod");
    msgCreater(buf,&com,MSG_LENGTH);
    udp->writeDatagram(buf,strlen(buf),QHostAddress::Broadcast,IPMSG_DEFAULT_PORT);

    }
    void LiveServer::readReady()
    {
    while (udp->hasPendingDatagrams()) {
    QByteArray datagram;
    datagram.resize(udp->pendingDatagramSize());
    QHostAddress sender;
    quint16 senderPort;

        udp->readDatagram(datagram.data(), datagram.size(),
                          &sender, &senderPort);
        SearchCommand com;
        msgParser(datagram,&com);
        isearch_arp_entry(datagram,sender,senderPort);
        if(com.commandNo==IPMSG_BR_ENTRY)
        {
            initCommand(&com);
            char buf[COM_LENGTH];
            memset(buf,0,sizeof(buf));
            com.commandNo=IPMSG_ANSENTRY;
            com.describe=das->getSettings("describe");
            com.hardVersion=das->getSettings("hardVersion");
            com.softVersion=das->getSettings("softVersion");
            com.sysLocation=das->getSettings("sysLocation");
            com.name=das->getSettings("name");
            com.product=das->getSettings("product");
            com.uuid=das->getSettings("uuid");
            com.ipAddr=das->getSettings("ipAddr");
            com.mac=das->getSettings("mac");
            com.mask=das->getSettings("mask");
            com.dns1=das->getSettings("dns1");
            com.dns2=das->getSettings("dns2");
            com.ipAddrMethod=das->getSettings("dynamic_static_ipmethod");
    
            msgCreater(buf,&com,MSG_LENGTH);
            udp->writeDatagram(buf,strlen(buf),sender,senderPort);
    
        }
    
    }
    

    }
    void LiveServer::initCommand(SearchCommand *com)
    {
    if (com == NULL)
    return;
    com->version = 1;
    com->packetNo = (unsigned int)time(NULL);
    com->commandNo =0 ;

    }
    int LiveServer::msgParser(QString data, SearchCommand* com)//, struct sockaddr_in *peer)
    {

    QStringList list=data.split(":");
    int count=list.count();
    if(count>4)
    {
        com->version=list.at(0).toUInt();
        com->packetNo=list.at(1).toUInt();
        com->commandNo=list.at(2).toUInt();
        com->uuid=list.at(3);
    }
    else
        return 0;
    for(int i=4;i<count;i++)
    {
        switch(i)
        {
        case 4:
            com->product=list.at(i);
            break;
        case 5:
            com->sysLocation=list.at(i);
            break;
        case 6:
            com->mac=list.at(i);
            break;
        case 7:
            com->ipAddr=list.at(i);
            break;
        case 8:
            com->mask=list.at(i);
            break;
        case 9:
            com->gateway=list.at(i);
            break;
        case 10:
            com->dns1=list.at(i);
            break;
        case 11:
            com->dns2=list.at(i);
            break;
        case 12:
            com->ipAddrMethod=list.at(i);
            break;
        case 13:
            com->name=list.at(i);
            break;
        case 14:
            com->softVersion=list.at(i);
            break;
        case 15:
            com->hardVersion=list.at(i);
            break;
        case 16:
            com->describe=list.at(i);
            break;
        case 17:
            com->additional=list.at(i);
            break;
    
    
        }
    }
    
    return count;
    

    }

    int LiveServer::msgCreater(char* msg, SearchCommand* com, size_t msgLen)
    {
    int len, tmp;
    char dest[COM_LENGTH];

    if ((dest==NULL)||(com==NULL))
        return -1;
    
    len = snprintf(dest, sizeof(dest), "%d:%d:%d:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s",
                   com->version,
                   com->packetNo,
                   com->commandNo,
                   com->uuid.toUtf8().data(),
                   com->product.toUtf8().data(),
                   com->sysLocation.toUtf8().data(),
                   com->mac.replace(":","").toUtf8().data(),
                   com->ipAddr.toUtf8().data(),
                   com->mask.toUtf8().data(),
                   com->gateway.toUtf8().data(),
                   com->dns1.toUtf8().data(),
                   com->dns2.toUtf8().data(),
                   com->ipAddrMethod.toUtf8().data(),
                   com->name.toUtf8().data(),
                   com->softVersion.toUtf8().data(),
                   com->hardVersion.toUtf8().data(),
                   com->describe.toUtf8().data(),
                   com->additional.toUtf8().data());
    tmp = sizeof(dest) - len - 1;
    
    strncpy(msg, dest, msgLen);
    
    return 0;
    

    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常
  • ¥15 关于风控系统,如何去选择
  • ¥15 这款软件是什么?需要能满足我的需求
  • ¥15 SpringSecurityOauth2登陆前后request不一致