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

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

2个回答

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;

}

“分客户端和服务端”,这就要求搞个cs架构了,有点麻烦

qq_38151907
大数据★东东 其实就是一个简单的UDP广播通讯,调用下查看自身IP的函数,不需要搞CS,我只需要很简单的通讯代码做个测试就行。
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Qt之局域网UDP通讯
创建两个QUdpSocket对象,一个用来发送数据,一个用来接收数据。发送数据的QUdpSocket需要绑定本机IP和端口,要不然是收不到数据的。 界面最上面的IP输入框是发送到的对方IP地址。中间是显示收到数据。下面的输入框是用来发送数据的。 在虚拟机中和本机通讯: Qt没有IP输入框,需要自己去封装,也可以网上下载。我前面也发了一个自己封装的IP输入框,功能大部分和Windows
获得局域网其他主机的ip地址代码
通过系统调用查看局域网内的计算机,获得局域网内的存活主机-View system calls through the computer LAN, LAN access to the survival of the mainframe
UDP广播 IP地址错误
[img=http://hi.csdn.net/attachment/201108/5/4165941_1312512375KCBq.jpg][/img]rn[img=http://hi.csdn.net/attachment/201108/5/4165941_1312512320nEN9.jpg][/img]rn服务器收到数据后.客户端使用的IP地址是不能上网的.CLI2和SER2为虚拟网卡rn
用UDP进行广播后绑定发送Json数据进行通讯
用UDP通讯,要绑定服务器的IP以及端口号,同样服务器也要知道它的信息要发给谁,所以客户端要将自己的IP以及端口号发送给服务器,以便服务器直接发送数据到该客户端。 我遇到的问题: 1.服务器接收到信息后,发送信息,客户端接收不到,用抓包工具进行检测的时候,发现客户端的端口号一直在更改。 端口号不断更改是正常的。服务器只需要处理只要是从该客户端IP发从过来的信息就可以,不用
局域网获取其他主机IP
[code=C/C++]//取得文件接收方 IP地址rn ent=::gethostbyname(hostname);rn if(ent==NULL)rn rn return;rn rn //ent 中IP地址就是网络字节序rn host.addr=*(ULONG *)ent->h_addr_list[0];rn 通过自己的主机名获取自己的IP成功rn 通过局域网其他机子主机机获取其IP返回ent==NULL?rn//////////套接字初始化用rnif(!AfxSocketInit())rn rn AfxMessageBox("加载套接字失败!");rn return false;rn [/code]
主机用IIS建立的http地址,同一个局域网的怎么访问?
主机用IIS建立的http地址,同一个局域网的怎么访问?知道的告诉下!!!谢谢了
用UDP向网络广播的问题
用UDP向网络广播数据时,怎么让自己的电脑不收到广播的数据??rn
有关用UdpSocket通过广播方式发送通讯包的问题
我想用UdpSocket来通过广播方式发送通讯包,但是每次发送都发不出去,报发送字节数为-1,代码如下:rn if(UdpSocket->Active) UdpSocket->Active = false;rn UdpSocket->BlockMode = bmNonBlocking;rn// UdpSocket->LocalHost = "192.168.0.196";rn UdpSocket->LocalPort = 30719; rn UdpSocket->RemoteHost = "255.255.255.255";rn UdpSocket->RemotePort = 30718; rn UdpSocket->Active = true;rnrn Bytes = UdpSocket->SendBuf(Buf,138,0);rn另外我如果把远程端口改为192.168.0.255则发送就没有问题。rn那位大虾给看一下是什么问题?万分感谢!!!rn
能否用udp广播方式传输文件?
我对udp广播不太熟,请问能否用udp广播方式传输文件?怎么传(最好有原代码)?rn 有关这方面的资料也行
怎么用DOS命令获得局域网其他主机IP?
如题
用socket发送大文件的一些问题(局域网+UDP)
不知道是什么原因,丢包率太大了,30%到40%,接收线程我已经最简化了,只接收原始数据包,数据包是自己定义的,每个1024字节,还有一个处理数据包线程,处理socket线程接收的数据包,这个太夸张了吧,我的socket类型是rnSendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);rn还有每次接收端处理数据都会占用大量的CPU时间(90%以上),不知道怎么解决,另外请教一个丢包验证的效率方法
UDP广播通讯,接收端能不能绑定发送端的IP地址??
在同一个局域网内,每台PC上都装有客户端和服务器端,服务器端广播发送数据,客户端接受数据,rn现在客户端会接收到别的计算机的服务器端发送的数据,怎么可以在接收端绑定服务器端的IP地址,rn只接收本机服务器发送的数据??rnrn服务器端是个死程序,现在只能改客户端,所以就别说改通讯方式之类的方法了。。。rnrn谢谢!!!!
python3 局域网udp广播
测试成功,主要是把host='&amp;lt;broadcast&amp;gt;'改为 HOST = '192.168.25.255' 局域网就测试成功了。 服务器端程序: #!/usr/bin/env python # -*- coding: utf-8 -*- from socket import * import time # HOST = '&amp;lt;broadcast&amp;gt;' HOST = ...
局域网多台计算机用同一个ip上网的方法
一般每台计算机只能用1个ip,但有些单位ip少,分配的计算机就少,为解决这个问题,可以按照我说得方法去做,就可实现两台或多台计算机用同一个ip
局域网 UDP 广播问题?
A机IP 10.1.21.11(子网掩码255.255.0.0,网关10.1.21.1)rnB机IP 10.1.23.152(子网掩码255.255.0.0,网关10.1.23.1)rnrn我在A机利用UDP进行广播,广播的地址为10.1.255.255,为什么在B机收不到。rnrnrnps:A机和B机网络是连同的,利用UDP单播时,B机可以接收到数据。rnrn跪求各位大侠赐解!!!
局域网 UDP广播
A机:192.168.19.1rnB机:192.168.19.128rn广播地址:192.169.19.255rnrnA机广播,俩机都能接到;rnB机广播,只B机接到;rnB机广播之后,A机再广播,只有B机收到。rnrn问题:B机的广播A机为什么收不到(B机已成功sendto);rn为什么B机广播之后,A机连自己的广播都收不到了。
用udp,怎样才能得到发送方的ip地址?
-
android发送UDP广播
在android平台实现UDP广播的发送示例程序
C++发送udp广播
使用c++语言编写的udp广播,在局域网内的其他设备通过接收udp广播获得信息 。
发送UDP广播
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; pu
UDP广播发送和接收端
UDP 广播通讯 接收端 发送端 代码可执行程序 截图
UDP广播中客户端获取主机IP地址用什么函数
如题
qt实现UDP通讯程序
在QT上实现UDP通讯程序,分为发送程序和接收程序,较为简单,易于实现
QT之UDP单播广播
所有文件 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include &amp;lt;QMainWindow&amp;gt; #include &amp;lt;QLabel&amp;gt; #include &amp;lt;QUdpSocket&amp;gt; namespace Ui { class MainWindow; } class MainWindow : ...
Qt Udp网络广播
Qt平台下写的一个基于UDP的网络广播,希望对初学者有帮助!
Qt中udp广播
请问一下,我用Qt中的QUdpsocket进行开发,想要广播之后接收回复,其中readDatagram的datagram.data()是不是就是回复的数据呀,然后显示在界面上,用ui->qlineedit->settext();,怎么没有成功呢
用java怎么实现UDP广播呀!!??
我现在要实现局域网的多点广播,但是却不知道怎么设置DatagramPacket的参数才可以实现多点广播??
用Java语言实现udp广播编程
发送方程序:import java.io.IOException;import java.net.DatagramPacket;import java.net.InetAddress;import java.net.MulticastSocket;public class BrodecastSend { public static void main(String[] args) throws I...
用UDP协议实现网络语音广播
用UDP协议实现网络语音广播...............
怎样发现自己所在局域网中的其他主机的IP地址__2018.08.09
在CMD中输入:“arp -a” 或者,使用程序,文件后缀名改为.bat。 COLOR 0A CLS @ECHO Off Title 查询局域网内在线电脑IP :send @ECHO off&amp;amp;setlocal enabledelayedexpansion ECHO 正在获取本机的IP地址,请稍等... for /f &quot;tokens=3 skip=2 delims=: &quot; %%...
UDP/IP网络广播方式的接收问题
现做一实时系统接口,一台UNIX机采用UDP/IP网络广播方式向局域网内发送数据,rn我现在WINDOWS下能用WINSOCK控件来接收到它发送的数据吗?,以下代码行不?rnWinsock1.Protocol = sckUDPProtocolrn Winsock1.Remoteport = 2001 rn Winsock1.RemoteHost = "192.100.100.1"rn Winsock1.bind 2002
求救!!!用CAsyncSocket实现UDP广播包!!!
在下要在VC++中实现UDP的广播,请问各位高手如何实现!!!rnrn另如何知道当前机器所允许的TCP或UDP包DATA的最大长度??rnrn还有,如何在TCP连接中断后自动重连???rnrnrn谢谢各位指教!!
怎么用SendMessage向其他窗口发送按键
怎么用SendMessage向其他窗口发送按键?????rn小弟想做一个DNF的连发程序,不想下载人家的,想自己写一个rn比如向窗口发送 K 这个键,下面是我的代码rn rn //发送按键 rn [DllImport("user32.dll", EntryPoint = "SendMessage")]rn static extern bool SendMessage(IntPtr hWnd, Int32 msg, Int32 wParam, Int32 lParam);rn //查找窗口句柄rn [DllImport("USER32.DLL")]rn public static extern IntPtr FindWindow(string lpClassName,rn string lpWindowName);rn //设置进程窗口到最前 rn [DllImport("USER32.DLL")]rn public static extern bool SetForegroundWindow(IntPtr hWnd);rn //WM_KEYDOWN 按下一个键rn public static int WM_KEYDOWN = 0x0100;rn //释放一个键rn public static int WM_KEYUP = 0x0101;rn //K键的键盘值rn public const int VK_SPACE = 75;rn private void button1_Click(object sender, EventArgs e)rn rn IntPtr dnf = FindWindow(null, "地下城与勇士");rn //如果找到窗口句柄rn if (dnf != IntPtr.Zero)rn rn //设置游戏窗口到最前 rn SetForegroundWindow(dnf);rn SendMessage(dnf, WM_KEYDOWN, VK_SPACE, 0);rn SendMessage(dnf, WM_KEYUP, VK_SPACE, 0); rn rnrn rnrn代码哪里错了?我只知道第一个参数是发送目标窗口的句柄,那第二个,第三个,第四个参数都是怎么写的?rn麻烦大家指导一下
用udp发送中文信息
private IPEndPoint receivePoint;rnserver = new UdpClient(6529);rnreceivePoint = new IPEndPoint(IPAddress.Any, 6529);rnrnrnpublic void start_server()//接收rn rn while (true)rn //接收从远程主机发送到本地6529端口的数据 rn tryrn rn byte[] recData = server.Receive(ref receivePoint);rn ASCIIEncoding encode = new ASCIIEncoding();rn //获得客户端请求数据 rn string Read_str = encode.GetString(recData); rn rn catch rn rn rnrnpublic void sendMessage(string sendMessage,string IP)//发送rn rn UdpClient newSend = new UdpClient();rn IPAddress newSendIP = IPAddress.Parse(IP);rn ASCIIEncoding newEncode = new ASCIIEncoding();rn IPEndPoint host = new IPEndPoint(newSendIP, 6529);rn byte[] sendData = newEncode.GetBytes(sendMessage);rn newSend.Send(sendData, sendData.Length, host);rn newSend.Close();rn rnrn用上面的函数可以正常发送英文字符,可是发送中文字符就变成问号了。rn要怎么才能正常发送中文字符?rn能不能给个代码,谢谢
DS7.5控制台通讯方式由主机名改为IP地址的设置
今天收到一个客户反馈,DS安装后,各种问题,偶尔正常,约好早上9点到10点远程,BUT一直等等。。。等到下午2点才有时间远程..(流汗……) 登录后,发现控制台使用主机名在通讯, 会出现如下报错 解决办法: 这个问题,用户困扰很久了,其实也不是产品问题,主要是安装的时候没有注意细节,结果一下就解决了^_^。 ...
局域网ip与mac地址的广播与阻止
路由器网关IP0,mac0rn台机1 ip1,mac1rn台机2 ip2,mac2rn其中ARP(ip-mac)列表,是通过ip的广播来建立。rn问题:当台机1想上网。rn1步,向其网段广播{ip1,mac1,网关ip0,求ip0的mac}。rn2步,当符合ip0的设备收到这广播的时候,会向台机1的mac1回送{ip0,mac0}。rn3步,确认建立连接。rn大概情况应该是这样,不全处大家补充。rnrn现在想让我的路由器拒绝一切的广播回传(直接忽略广播)。不知道各位高手有什么办法没有???rnrn目的:让局域网内的机器全部通过设置静态ARP列表来实现管理。
局域网通讯不要服务端?
类似飞鸽传书。。。不需要服务端rn怎样实现的?rn在网上找了一下没找到相关的资料!
如何查看局域网中其他主机的Ip
有相关的dos命令么?rn查看同一网段的。
Unity中运用UDP广播服务器IP实现局域网联机
这断时间,涉及到局域网联机游戏,4台游戏机实现联机,运用到了UDP广播功能。本来自己对这个完全没接触,不知道可以用UDP,是同事有做过这个,在他的指导下,算是可以用了。只是运行后会卡死机器,网上查资料,加上自己的研究,总算是解决了,原因就是接收的udpclient在没有收到广播的情况下,一直阻塞,导致线程无法关闭,后来我就在关闭的地方手动进行关闭,就不会卡啦。写个博客,可以给有需要的人一个参考,也
如何判断一个IP地址是不是和自己在同一个局域网
如何判断一个IP地址是不是和自己在同一个局域网rnrn我的主机既连内网,又连外网,现在我想让内网访问的IP通过内网地址访问,如192.168.0.1rn外网地址通过变换后的IP访问,如 www.sdij.cnrn怎么判断一个IP是不是和自己在一个局域网内.
相关热词 c# 去空格去转义符 c#用户登录窗体代码 c# 流 c# linux 可视化 c# mvc 返回图片 c# 像素空间 c# 日期 最后一天 c#字典序排序 c# 截屏取色 c#中的哪些属于托管机制