需求:
多台机器接入局域网,在相互不知道IP的情况下要通信
需要在设备接入局域网的时候,自动获取局域网内其它设备的IP地址,并让其他设备也知道自己的IP地址
理论:
使用局域网广播,将自己的信息广播出去
在接收到IP广播消息的时候,将自己的信息返回给发送者
这样每台新设备在接入网络时都可以发现之前已存在的机器并让其他机器也发现自己
实现:
/** 初始化网络,即创建QT网络套接字并绑定,并且设定收到消息时的槽函数 */
int HomeNet::NetInit()
{
broadSocket = new QUdpSocket(this);
broadSocket->bind(BROAD_PORT);
connect(broadSocket, SIGNAL(readyRead()), this, SLOT(recvOtherIp())); broadMyIp("testIP");
}
/** 向网内广播自己的网络别名和信息 */
void HomeNet::broadMyIp(char *myNetName)
{
QByteArray broadgram = "SDIP";
broadgram += myNetName;
broadSocket->writeDatagram(broadgram.data(), broadgram.size(), QHostAddress::Broadcast, BROAD_PORT);
}
/** 当有udp消息到达产生readyRead()信号时的槽函数,判断消息类型并做处理 */
void HomeNet::recvOtherIp()
{
QByteArray datagram;
QHostAddress sender;
quint16 senderPort;
datagram.resize(broadSocket->pendingDatagramSize());
broadSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
/** 如果是SDIP消息,记录发送者IP,并返回GTIP消息 */
if(strncmp(datagram.data(), "SDIP", 4) == 0)
{
//记录发送者信息
printf("get SDIP :%s\n", datagram.data() + 4);
/** 记录发送者IP */
//返回GTIP消息
memset(datagram.data(), 0, sizeof(QByteArray));
datagram = "GTIP";
broadSocket->writeDatagram(datagram.data(), datagram.size(), sender, BROAD_PORT);
}
else if(strncmp(datagram.data(), "GTIP", 4) == 0)
{
printf("get GTIP :%s\n", datagram.data() + 4);
/** 记录返回者IP */
}
}