[QT]局域网内机器的自发现实现
2012-06-19 14:24
871 查看
需求:
多台机器接入局域网,在相互不知道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 */
}
}
相关文章推荐
- [编辑杂合] Virtualbox实现虚拟机与主机互相访问,并且虚拟机成为主机所在局域网的一台可访问机器
- 局域网(LAN)端口与广域网(WAN/外网)端口映射——实现让局域网机器在外网做服务器
- 基于qt和opencv3实现机器学习之:利用最近邻算法(knn)实现手写数字分类
- Qt实现的局域网对战五子棋
- 基于qt和opencv3实现机器学习之:利用正态贝叶斯分类
- 基于qt和opencv3实现机器学习之:对OCR进行分类
- Tomcat设置IP,实现局域网内机器访问
- Qt UDP发现网关实现
- win7下局域网实现发现共享
- 用批处理实现向局域网内多台机器中复制文件
- C#利用cmd远程局域网内机器实现文件互传
- 利用ssh实现对局域网内机器的访问
- QT使用WOL实现远程一键开机(局域网)
- 局域网发现设备代码实现:udp组播
- 在知道对方机器的IP(局域网内)用户 密码,实现远程重启
- QT使用WOL实现远程一键开机(局域网,需要目标电脑的主板支持,并且插上网线,用udpSocket.writeDatagram一句话就可以)
- 基于qt和opencv3实现机器学习之:利用svm(支持向量机)分类
- Qt实现局域网聊天室:类似QQ抖动窗口功能的实现
- win7下局域网实现发现共享