Qt中创建次线程用户获取本地IP地址并进行UDP广播

Qt可以通过继承QThread来实现线程的创建。

broadcastthread.h

/*******************************************************************/
// Content      :开辟次线程
// Update record:
// Date        Author        Comments
// ----------  ------------  -------------------------------
/*******************************************************************/
#ifndef BROADCASTTHREAD_H
#define BROADCASTTHREAD_H
#include "qthread.h"
 
 
/*******************************************************************/
// Function     :开辟次线程发送UDP报文和监听tcp连接
/*******************************************************************/
class BroadcastThread : public QThread
{
  Q_OBJECT
public:
  BroadcastThread();
  ~BroadcastThread();
private:
  /*******************************************************************/
  // Function     :获取本机IP地址
  // Parameters   :localHost:本机计算机名
  // Return       :ipAddr:本机IP地址
  /*******************************************************************/
  QString getIP(QString localHost);
 
 
signals:
  /*******************************************************************/
  // Function     :触发开始监听信号
  // Parameters   :address:监听的IP地址
  // Return       
  /*******************************************************************/
  void startlisten(QString address);
  /*******************************************************************/
  // Function     :触发停止监听信号
  // Parameters   
  // Return       
  /*******************************************************************/
  void stoplisten();
 
 
protected:
  /*******************************************************************/
  // Function     :获取本机IP地址并发送UDP报文和监听tcp连接
  // Parameters   
  // Return       
  /*******************************************************************/
  void run();
};
 
 
#endif // BROADCASTTHREAD_H
 
 
 
 
 
 

broadcastthread.cpp

#include "broadcastthread.h"
#include "asdu_define.h"
#include "commmodule.h"
#include "qhostaddress.h"
#include "qhostinfo.h"
#include "qnetworkinterface.h"
#include "dbmodule.h"
 
 
 
 
BroadcastThread::BroadcastThread()
  : QThread()
{
 
 
}
 
 
BroadcastThread::~BroadcastThread()
{
 
 
}
 
 
/*******************************************************************/
// Function     :获取本机IP地址
// Parameters   :localHost:本机计算机名
// Return       :ipAddr:本机IP地址
/*******************************************************************/
QString BroadcastThread::getIP(QString localHost)
{
  QString ipAddr;
  QHostInfo info = QHostInfo::fromName(localHost);
  info.addresses();//QHostInfo的address函数获取本机ip地址
  //如果存在多条ip地址ipv4和ipv6:
  foreach(QHostAddress address,info.addresses())
  {
    if(address.protocol()==QAbstractSocket::IPv4Protocol){//只取ipv4协议的地址
      //          qDebug()<<address.toString();
      ipAddr = address.toString();
    }
  }
  return ipAddr;
}
 
 
/*******************************************************************/
// Function     :获取本机IP地址并发送UDP报文和监听tcp连接
// Parameters   
// Return       
/*******************************************************************/
void BroadcastThread::run()
{
  CommInterface * cm = CommModule::GetInterface();
  QByteArray socket_info;
  QString localHost,localAddress,lastAddress;
  localHost = QHostInfo::localHostName();
  localAddress = getIP(localHost);
  lastAddress = localAddress;
  emit startlisten(localAddress);
  while(1)
  {
    socket_info.clear();
    localHost = QHostInfo::localHostName();
    if(Temp::g_hostaddress=="")
    {
      localAddress = getIP(localHost);
    }
    else
    {
      localAddress = Temp::g_hostaddress;
    }
    QStringList iplist = localAddress.split(".");
    if(iplist.count()!=4)
      return;
    QString ip1 = iplist.at(0);
    QString ip2 = iplist.at(1);
    QString ip3 = iplist.at(2);
    QString ip4 = iplist.at(3);
    quint8 type= 0;
    socket_info.append(char(LSB(type)));
    socket_info.append(char(LSB(type)));
    socket_info.append(char(LSB(type)));
    socket_info.append(char(LSB(type)));
    socket_info.append(KUdpSetIP);
    socket_info.append(ip1.toInt());
    socket_info.append(ip2.toInt());
    socket_info.append(ip3.toInt());
    socket_info.append(ip4.toInt());
    cm->DealUIOrder(socket_info);
    if(lastAddress != localAddress)
    {
      emit stoplisten();
      QThread::msleep(1000);
      emit startlisten(localAddress);
    }
    lastAddress = localAddress;
    QThread::msleep(5000);
  }
}

其中

Temp::g_hostaddress为全局变量,如果全局变量为空,则广播自动获取的IP地址,如果不为空,则广播全局变量中的IP地址。

猜你喜欢

转载自blog.csdn.net/xjh_2017/article/details/80656001