当前位置: 首页 > news >正文

室内设计网站公司建邺做网站价格

室内设计网站公司,建邺做网站价格,禅城网站建设联系电话,广州天河区房价多少钱一平方文章目录 1. UDP组播的特性2. UDP 组播实例程序的功能3. 组播功能的程序实现4. 源码4.1 可视化UI设计4.2 mainwindow.h4.3 mainwindow.cpp 1. UDP组播的特性 下图简单表示了组播的原理。UDP 组播是主机之间“一对一组”的通信模式#xff0c;当多个客户端加入由一个组播地址定… 文章目录 1. UDP组播的特性2. UDP 组播实例程序的功能3. 组播功能的程序实现4. 源码4.1 可视化UI设计4.2 mainwindow.h4.3 mainwindow.cpp 1. UDP组播的特性 下图简单表示了组播的原理。UDP 组播是主机之间“一对一组”的通信模式当多个客户端加入由一个组播地址定义的多播组之后客户端向组播地址和端口发送的 UDP 数据报组内成员都可以接收到其功能类似于 QQ 群。 组播报文的目的地址使用 D 类 IP 地址D 类地址不能出现在 IP 报文的源 IP 地址字段。用同一个 IP 多播地址接收多播数据报的所有主机构成了一个组称为多播组 (或组播组)。所有的信息接收者都加入到一个组内并且一旦加入之后流向组地址的数据报立即开始向接收者传输组中的所有成员都能接收到数据报。组中的成员是动态的主机可以在任何时间加入和离开组。 所以采用 UDP 组播必须使用一个组播地址。组播地址是 D 类IP 地址有特定的地址段。多播组可以是永久的也可以是临时的。多播组地址中有一部分由官方分配称为永久多播组。永久多播组保持不变的是它的 IP 地址组中的成员构成可以发生变化。永久多播组中成员的数量可以是任意的甚至可以为零。那些没有保留下来的供永久多播组使用的 IP 组播地址可以被临时多播组利用。关于组播IP 地址有如下的一些约定: 224.0.0.0~224.0.0.255 为预留的组播地址 (永久组地址)地址 224.0.0.0 保留不做分配其他地址供路由协议使用224.0.1.0~224.0.1.255 是公用组播地址可以用于 Intermet224.0.2.0~238.255.255.255 为用户可用的组播地址 (临时组地址)全网范围内有效239.0.0.0~239.255.255.255 为本地管理组播地址仅在特定的本地范围内有效。 所以若是在家庭或办公室局域网内测试 UDP 组播功能可以使用的组播地址范围是239.0.0.0~239.255.255.255。 QUdpSocket 支持 UDP 组播joinMulticastGroup()函数使主机加入一个多播组leaveMulticastGroup()函数使主机离开一个多播组UDP 组播的特点是使用组播地址其他的端口绑定、数据报收发等功能的实现与单播 UDP 完全相同。 2. UDP 组播实例程序的功能 设计一个UDP 组播实例程序 Samp14_4在两台计算机上分别运行进行组播通信。图 14-10是运行于主机 192.168.1.104 上的程序图 14-11 是运行于主机 192.168.1.106 上的程序。两个主机上的程序都加入地址为239.255.43.21的多播组绑定端口 35320进行通信。 从图 14-10 和图14-11可以看到两个 Samp14_4 程序都可以发送和接收组播数据报且在自已主机上发出的数据报自己也可以接收到。 3. 组播功能的程序实现 程序的主窗口是基于 QMainWindow 的类 MainWindow界面由 UI 设计器设计其类定义如下(忽略 UI 设计器生成的槽函数): #ifndef MAINWINDOW_H #define MAINWINDOW_H#include QMainWindow#include QUdpSocket #include QLabelnamespace Ui { class MainWindow; }class MainWindow : public QMainWindow {Q_OBJECTprivate:QLabel *LabSocketState;QUdpSocket *udpSocket;//用于与连接的客户端通讯的QTcpSocketQHostAddress groupAddress;//组播地址QString getLocalIP();//获取本机IP地址 public:explicit MainWindow(QWidget *parent 0);~MainWindow();private slots: //自定义槽函数void onSocketStateChange(QAbstractSocket::SocketState socketState);void onSocketReadyRead();//读取socket传入的数据 ...private:Ui::MainWindow *ui; };#endif // MAINWINDOW_H 其中定义了一个QHostAddress 类型变量 groupAddress用于记录组播地址。下面是 MainWindow的构造函数的代码: MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui-setupUi(this);LabSocketStatenew QLabel(Socket状态);//LabSocketState-setMinimumWidth(200);ui-statusBar-addWidget(LabSocketState);QString localIPgetLocalIP();//本地主机名this-setWindowTitle(this-windowTitle()----本机IPlocalIP);udpSocketnew QUdpSocket(this);//用于与连接的客户端通讯的QTcpSocket //Multicast路由层次1表示只在同一局域网内//组播TTL: 生存时间每跨1个路由会减1多播无法跨过大多数路由所以为1//默认值是1表示数据包只能在本地的子网中传送。udpSocket-setSocketOption(QAbstractSocket::MulticastTtlOption,1); // udpSocket-setSocketOption(QAbstractSocket::MulticastTtlOption,ui-spinTTL-value());connect(udpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));onSocketStateChange(udpSocket-state());connect(udpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead())); }其中使用了 QUdpSocket::setSocketOption()函数对 socket 进行参数设置 udpSocket-setSocketOption(QAbstractSocket::MulticastTtlOption,1); 将 socket 的 QAbstractSocket::MulticastTtlOption 值设置为1。MulticastTtlOption 是 UDP组播的数据报的生存期数据报每跨1个路由会减1。缺省值为 1表示多播数据报只能在同一路由下的局域网内传播。 要进行UDP 组播通信UDP 客户端必须先加入UDP 多播组也可以随时退出多播组。主窗口上的“加入组播”和“退出组播”按钮的代码如下: void MainWindow::on_actStart_triggered() {//加入组播QString IPui-comboIP-currentText();groupAddressQHostAddress(IP);//多播组地址quint16 groupPortui-spinPort-value();//端口if (udpSocket-bind(QHostAddress::AnyIPv4, groupPort, QUdpSocket::ShareAddress))//先绑定端口{udpSocket-joinMulticastGroup(groupAddress); //加入多播组ui-plainTextEdit-appendPlainText(**加入组播成功);ui-plainTextEdit-appendPlainText(**组播地址IPIP);ui-plainTextEdit-appendPlainText(**绑定端口QString::number(groupPort));ui-actStart-setEnabled(false);ui-actStop-setEnabled(true);ui-comboIP-setEnabled(false);}elseui-plainTextEdit-appendPlainText(**绑定端口失败); }void MainWindow::on_actStop_triggered() {//退出组播udpSocket-leaveMulticastGroup(groupAddress);//退出组播udpSocket-abort(); //解除绑定ui-actStart-setEnabled(true);ui-actStop-setEnabled(false);ui-comboIP-setEnabled(true);ui-plainTextEdit-appendPlainText(**已退出组播,解除端口绑定); } 加入组播之前必须先绑定端口绑定端口的语句是: udpSocket-bind(QHostAddress::AnyIPv4, groupPort, QUdpSocket::ShareAddress) 这里指定地址为QHostAddress::AnyIPv4端口为多播组统一的一个端口。 使用 QUdpSocket:: joinMulticastGroup()函数加入多播组即: udpSocket-joinMulticastGroup(groupAddress); //加入多播组 多播组地址 groupAddress 由界面上的组合框里输入。注意局域网内的组播地址的范围239.0.0.0~239.255.255.255绝对不能使用本机地址作为组播地址。 退出多播组使用 QUdpSocket::leaveMulticastGroup()函数即: udpSocket-leaveMulticastGroup(groupAddress);//退出组播 加入多播组后发送组播数据报也是使用 writeDatagram()函数只是目标地址使用的是组播地址在 readyRead()信号的槽函数里用 readDatagram()读取数据报。下面是发送和读取数据报的代码: void MainWindow::on_btnMulticast_clicked() {//发送组播消息quint16 groupPortui-spinPort-value();QString msgui-editMsg-text();QByteArray datagrammsg.toUtf8();udpSocket-writeDatagram(datagram,groupAddress,groupPort); // udpSocket-writeDatagram(datagram.data(),datagram.size(), // groupAddress,groupPort);ui-plainTextEdit-appendPlainText([multicst] msg);ui-editMsg-clear();ui-editMsg-setFocus(); }void MainWindow::onSocketReadyRead() {//读取数据报while(udpSocket-hasPendingDatagrams()){QByteArray datagram;datagram.resize(udpSocket-pendingDatagramSize());QHostAddress peerAddr;quint16 peerPort;udpSocket-readDatagram(datagram.data(),datagram.size(),peerAddr,peerPort);// udpSocket-readDatagram(datagram.data(),datagram.size());QString strdatagram.data();QString peer[From peerAddr.toString():QString::number(peerPort)] ;ui-plainTextEdit-appendPlainText(peerstr);} }4. 源码 4.1 可视化UI设计 4.2 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include QMainWindow#include QUdpSocket #include QLabelnamespace Ui { class MainWindow; }class MainWindow : public QMainWindow {Q_OBJECTprivate:QLabel *LabSocketState;QUdpSocket *udpSocket;//用于与连接的客户端通讯的QTcpSocketQHostAddress groupAddress;//组播地址QString getLocalIP();//获取本机IP地址 public:explicit MainWindow(QWidget *parent 0);~MainWindow();private slots: //自定义槽函数void onSocketStateChange(QAbstractSocket::SocketState socketState);void onSocketReadyRead();//读取socket传入的数据 //void on_actStart_triggered();void on_actStop_triggered();void on_actClear_triggered();void on_actHostInfo_triggered();void on_btnMulticast_clicked();private:Ui::MainWindow *ui; };#endif // MAINWINDOW_H 4.3 mainwindow.cpp #include mainwindow.h #include ui_mainwindow.h #include QtNetworkQString MainWindow::getLocalIP() {QString hostNameQHostInfo::localHostName();//本地主机名QHostInfo hostInfoQHostInfo::fromName(hostName);QString localIP;QListQHostAddress addListhostInfo.addresses();//if (!addList.isEmpty())for (int i0;iaddList.count();i){QHostAddress aHostaddList.at(i);if (QAbstractSocket::IPv4ProtocolaHost.protocol()){localIPaHost.toString();break;}}return localIP; }MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui-setupUi(this);LabSocketStatenew QLabel(Socket状态);//LabSocketState-setMinimumWidth(200);ui-statusBar-addWidget(LabSocketState);QString localIPgetLocalIP();//本地主机名this-setWindowTitle(this-windowTitle()----本机IPlocalIP);udpSocketnew QUdpSocket(this);//用于与连接的客户端通讯的QTcpSocket //Multicast路由层次1表示只在同一局域网内//组播TTL: 生存时间每跨1个路由会减1多播无法跨过大多数路由所以为1//默认值是1表示数据包只能在本地的子网中传送。udpSocket-setSocketOption(QAbstractSocket::MulticastTtlOption,1); // udpSocket-setSocketOption(QAbstractSocket::MulticastTtlOption,ui-spinTTL-value());connect(udpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));onSocketStateChange(udpSocket-state());connect(udpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead())); }MainWindow::~MainWindow() {udpSocket-abort();delete udpSocket;delete ui; }void MainWindow::onSocketStateChange(QAbstractSocket::SocketState socketState) {switch(socketState){case QAbstractSocket::UnconnectedState:LabSocketState-setText(scoket状态UnconnectedState);break;case QAbstractSocket::HostLookupState:LabSocketState-setText(scoket状态HostLookupState);break;case QAbstractSocket::ConnectingState:LabSocketState-setText(scoket状态ConnectingState);break;case QAbstractSocket::ConnectedState:LabSocketState-setText(scoket状态ConnectedState);break;case QAbstractSocket::BoundState:LabSocketState-setText(scoket状态BoundState);break;case QAbstractSocket::ClosingState:LabSocketState-setText(scoket状态ClosingState);break;case QAbstractSocket::ListeningState:LabSocketState-setText(scoket状态ListeningState);} }void MainWindow::onSocketReadyRead() {//读取数据报while(udpSocket-hasPendingDatagrams()){QByteArray datagram;datagram.resize(udpSocket-pendingDatagramSize());QHostAddress peerAddr;quint16 peerPort;udpSocket-readDatagram(datagram.data(),datagram.size(),peerAddr,peerPort);// udpSocket-readDatagram(datagram.data(),datagram.size());QString strdatagram.data();QString peer[From peerAddr.toString():QString::number(peerPort)] ;ui-plainTextEdit-appendPlainText(peerstr);} }void MainWindow::on_actStart_triggered() {//加入组播QString IPui-comboIP-currentText();groupAddressQHostAddress(IP);//多播组地址quint16 groupPortui-spinPort-value();//端口if (udpSocket-bind(QHostAddress::AnyIPv4, groupPort, QUdpSocket::ShareAddress))//先绑定端口{udpSocket-joinMulticastGroup(groupAddress); //加入多播组ui-plainTextEdit-appendPlainText(**加入组播成功);ui-plainTextEdit-appendPlainText(**组播地址IPIP);ui-plainTextEdit-appendPlainText(**绑定端口QString::number(groupPort));ui-actStart-setEnabled(false);ui-actStop-setEnabled(true);ui-comboIP-setEnabled(false);}elseui-plainTextEdit-appendPlainText(**绑定端口失败); }void MainWindow::on_actStop_triggered() {//退出组播udpSocket-leaveMulticastGroup(groupAddress);//退出组播udpSocket-abort(); //解除绑定ui-actStart-setEnabled(true);ui-actStop-setEnabled(false);ui-comboIP-setEnabled(true);ui-plainTextEdit-appendPlainText(**已退出组播,解除端口绑定); }void MainWindow::on_actClear_triggered() {ui-plainTextEdit-clear(); }void MainWindow::on_actHostInfo_triggered() {QString hostNameQHostInfo::localHostName();//本地主机名ui-plainTextEdit-appendPlainText(本机主机名hostName\n);QHostInfo hostInfoQHostInfo::fromName(hostName);QListQHostAddress addListhostInfo.addresses();//if (!addList.isEmpty())for (int i0;iaddList.count();i){QHostAddress aHostaddList.at(i);if (QAbstractSocket::IPv4ProtocolaHost.protocol()){QString IPaHost.toString();ui-plainTextEdit-appendPlainText(本机IP地址aHost.toString());if (ui-comboIP-findText(IP)0)ui-comboIP-addItem(IP);}} }void MainWindow::on_btnMulticast_clicked() {//发送组播消息quint16 groupPortui-spinPort-value();QString msgui-editMsg-text();QByteArray datagrammsg.toUtf8();udpSocket-writeDatagram(datagram,groupAddress,groupPort); // udpSocket-writeDatagram(datagram.data(),datagram.size(), // groupAddress,groupPort);ui-plainTextEdit-appendPlainText([multicst] msg);ui-editMsg-clear();ui-editMsg-setFocus(); }
http://www.hkea.cn/news/14489135/

相关文章:

  • 个人站长怎么做企业网站什么是h5网站
  • 网站外链建设可以提升网站权重吗wordpress怎么改为中文
  • 公司网站建设沈阳广州企业网站制作公司
  • 一站式网站搭建企业网站推广哪家好
  • 公司模板网站建设福州网站搜索引擎优化
  • 厦门网站设计推广公司国外 网站设计
  • 建设广告网站费用保险公司发展规划
  • 宝安龙华积分商城网站建设佛山网站建设专家
  • 二手书店网站建设规划书wordpress 多站点 子目录
  • 网站开发期末作品代码和数据库运行好大全吃什么补肾最快最好
  • 上海做网站比较好的公司有哪些网站开发外包维护合同
  • 网站建设的几点体会清远市住房与城乡建设局的网站查
  • 学校响应式网站建设塘沽信息
  • 重庆信息网站推广广州有哪些网络设计公司
  • 重庆在百度做个网站多少钱html网站开发教程
  • 东莞建设网站开发最优惠的建设网站建设
  • 营销网站方案设计做招聘网站需要什么人员
  • 自己做的网站如何上百度外地公司做的网站能备案
  • 网站怎么做限时抢购北京最新消息今天上午
  • wordpress评论邮件插件优化人员配置
  • 河北省住房城乡建设厅网站做自媒体可以搬运国外网站新闻吗
  • 群艺馆网站建设方案wordpress下载教程
  • 建设风景区网站的目的企业网站建设比较好
  • seo建站系统南约社区网站建设
  • 人社局网站建设方案打字赚钱平台 学生一单一结
  • 东北网站建设公司电子商务网页设计与网站建设
  • 服务器 网站打开慢如何让网站排名下降
  • 中山网站推广优化正规的彩票网站怎么做
  • 网站建设深圳哪里学html格式的网站地图
  • 网址站点出现异常怎么办网站备案新增域名