zoukankan      html  css  js  c++  java
  • UDP编程

     

    一、概述:                                           
    #include <QUdpSocket>
    QUdpSocket类继承自QAbstractSocket,该类中的所有函数都是可重入的(reentrent)。
     
    二、介绍:                                           
    QUdpSocket公有类型:
    1. enum    BindFlag {ShareAddress, DontShareAddress, ReuseAddressHint, DefaultForPlatform }flags   BindModeQUdpSocket公共函数:QUdpSocket ( QObject * parent = 0 ) virtual  ~QUdpSocket ()bool  bind ( const QHostAddress & address, quint16 port )bool bind ( const QHostAddress & address, quint16 port, BindMode mode )bool  bind ( quint16 port = 0 )bool   bind ( quint16 port, BindMode mode )bool    hasPendingDatagrams () constbool    joinMulticastGroup ( const QHostAddress & groupAddress )bool    joinMulticastGroup ( const QHostAddress & groupAddress, const QNetworkInterface & iface )bool   leaveMulticastGroup ( const QHostAddress & groupAddress )bool   leaveMulticastGroup ( const QHostAddress & groupAddress, const QNetworkInterface & iface )QNetworkInterface multicastInterface () constqint64   pendingDatagramSize () constqint64  readDatagram ( char * data, qint64 maxSize, QHostAddress * address = 0, quint16 * port = 0 )void    setMulticastInterface ( const QNetworkInterface & iface )qint64 writeDatagram ( const char * data, qint64 size, const QHostAddress & address, quint16 port )qint64  writeDatagram ( const QByteArray & datagram, const QHostAddress & host, quint16 port )  

    QUdpSocket描述:
    QUdpSocket提供了UDP套接字API,用来接收和发送UDP数据报。
    QUdpSocket类最通用的使用方式是:用bind()函数绑定一个IP地址和端口Port,然后调用writeDatagram()和readDatagram()函数传输数据。如果要使用QIODevice中的read(), readLine(), write()等函数,必须首先调用connectToHost()函数,直接建立一个和对方的连接。
     
    只要向网络写入了一个数据报,SOCKET就产生一个bytesWritten()信号,如果仅仅是发送数据报,无需调用bind()。
    数据报到来,readyRead()信号被产生,此时hasPendingDatagrams()函数返回真(true)。调用pendingDatagramSize()获取第一个数据报的长度(size),readDatagram()读取数据报内容。
     
    注意:接收到readyRead()信号后,应当读取该数据报,否则下一个数据报到来后将不再产生readyRead()信号。
    1. Example:void Server::initSocket(){     udpSocket = new QUdpSocket(this);     udpSocket->bind(QHostAddress::LocalHost, 7755);     connect(udpSocket, SIGNAL(readyRead()),             this, SLOT(readPendingDatagrams()));}void Server::readPendingDatagrams(){     while (udpSocket->hasPendingDatagrams()) {         QByteArray datagram;         datagram.resize(udpSocket->pendingDatagramSize());         QHostAddress sender;         quint16 senderPort;         udpSocket->readDatagram(datagram.data(), datagram.size(),                                 &sender, &senderPort);         processTheDatagram(datagram);     }}  

    QUdpSocket类也支持UPD组播(multicast)。joinMulticastGroup()和leaveMulticastGroup()用来控制组成员,QAbstractSocket::MulticastTtlOption和QAbstractSocket::MulticastLoopbackOption分别用来设置socket的TTL和回环(loopback)选项,setMulticastInterface()用来为组播数据报设置对外接口,multicastInterface()来获取该接口类型:IP_MULTICAST_IF对应IPv4,IPV6_MULTICAST_IFIPv6。
     
    通过QUdpSocket类,还可以使用connectToHost()建立和UDP服务器的虚拟连接,然后使用read()和write()交换数据,而不必为每一个数据报都指定接收者(receiver)。
     
    三、成员标志含义:                                     
    1. enum QUdpSocket::BindFlagflags QUdpSocket::BindMode  
    BindFlag 这些值可以组成不同的标志,传递给QUdpSocket::bind()函数来修改bind()的特性。
    BindMode 是typedef for QFlags<BindFlag>。它是BindFlag值得或操作。
    常量定义
    描述
    QUdpSocket::ShareAddress
    0x1
    1、允许其他服务绑定同样的地址和端口
    2、当多进程通过监听同一地址和端口,进而共享单个服务的负载时,将十分有用(例如:一个拥有几个预先建立的监听者的WEB服务器能够改善响应时间)。不过,由于任何服务都允许重新绑定(rebind),该选项应该引起某些安全上的考虑
    3、需要注意的是,把该选项和ReuseAddressHint结合,也会允许你的服务重新绑定一个已存在的共享地址
    4、在Unix上,该选项等同于SO_REUSEADDR;在Windows上,该选项被忽略
    QUdpSocket::DontShareAddress
    0x2
    1、采用专有的方式绑定某个地址和端口,其他任何服务都不能再重新绑定
    2、通过该选项,确保绑定成功,指定的服务将是地址和端口唯一监听者,就算是拥有ReuseAddressHint的服务也不允许重新绑定
    3、在安全性上,该选项优于ShareAddress,但是在某些操作系统上需要管理员的权限才能运行
    4、在Unix和Mac OS上,绑定地址和端口的默认行为是非共享,所以该选项会被忽略;在Windows上,等同于SO_EXCLUSIVEADDRUSE套接字选项
    QUdpSocket::ReuseAddressHint
    0x4
    1、为QUdpSocke提供提示,即在地址和端口已经被其他套接字绑定的情况下,也应该试着重新绑定
    2、在Unix上,该选项被忽略;在Windows上等同于SO_REUSEADDR 套接字选项
    QUdpSocket::DefaultForPlatform
    0x0
    1、当前平台的默认选项
    2、在Unix和Mac OS上,该选项等同于DontShareAddress + ReuseAddressHint;在Windows上等同于ShareAddress
  • 相关阅读:
    104.Maximum Depth of Binary Tree
    101.Symmetric Tree
    100.Same Tree
    9.Palindrome Number
    图形化编程娱乐于教,Kittenblock实例,麦克风的录音
    图形化编程娱乐于教,Kittenblock实例,老外问路
    图形化编程娱乐于教,Kittenblock实例,解说员的解说
    图形化编程娱乐于教,Kittenblock实例,甲壳虫画画
    图形化编程娱乐于教,Kittenblock实例,角色移到某坐标
    图形化编程娱乐于教,Kittenblock实例,角色独舞和中文朗读
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4813013.html
Copyright © 2011-2022 走看看