Qt下UDP编程学习

一、概述:

#include <QUdpSocket>

QUdpSocket类继承自QAbstractSocket,该类中的所有函数都是可重入的(reentrent)。

二、介绍:

QUdpSocket公有类型:

enum	BindFlag {ShareAddress, DontShareAddress, ReuseAddressHint, DefaultForPlatform }
flags	BindMode

QUdpSocket公共函数:
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 () const
bool	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 () const
qint64	pendingDatagramSize () const
qint64	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()信号。

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)。

三、成员类型含义:

enum QUdpSocket::BindFlag
flags 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

Qt下UDP编程学习

时间: 2024-08-28 15:24:34

Qt下UDP编程学习的相关文章

linux下网络编程学习——入门实例ZZ

http://www.cppblog.com/cuijixin/archive/2008/03/14/44480.html 是不是还对用c怎么实现网络编程感到神秘莫测阿,我们这里就要撕开它神秘的面纱,呵呵. 一起来: 诶,不要着急,我们先来介绍一些网络程序的主要执行过程,主要是便于大家更好的理解下面的程序实例哦 : 1)系统启动服务器执行.服务器完成一些初始化操作,然后进入睡眠状态,等待客户机请求.2)在网络的某台机器上,用户执行客户机程序3)客户机进行与服务器进程建立一条连接4)连接建立后,客

Linux下网络编程学习杂记

1.TCP/IP协议的体系结构包含四层:应用层(负责应用程序的网络服务,通过端口号识别各个不同的进程)->传输层(传输控制层协议TCP.用户数据报协议UDP.互联网控制消息协议ICMP)->网络层->网络接口层(负责将二进制流转换成数据帧,并进行数据帧的发送和接收)->硬件层. 2.服务器是指能在网络上提供服务的任何程序:客户机是指用户为了得到某种服务所需运行的应用程序. 3.网络通信即为进程间的通信,套接口就是网络进程的ID.使用端口号和网络地址的组合能够唯一确定整个网路中的一个

linux下网络编程学习——入门实例

http://www.cppblog.com/cuijixin/archive/2008/03/14/44480.html 是不是还对用c怎么实现网络编程感到神秘莫测阿,我们这里就要撕开它神秘的面纱,呵呵. 一起来: 诶,不要着急,我们先来介绍一些网络程序的主要执行过程,主要是便于大家更好的理解下面的程序实例哦 : 1)系统启动服务器执行.服务器完成一些初始化操作,然后进入睡眠状态,等待客户机请求.2)在网络的某台机器上,用户执行客户机程序3)客户机进行与服务器进程建立一条连接4)连接建立后,客

Qt下TCP编程

一.服务器 1.声明一个QTcpServer对象 QTcpServer* serverListener; 2.new出对象 this->serverListener = new QTcpServer(); 3.服务器监听 QHostAddress ipAddress("192.168.1.1"); quint16 ipPort = 8080; serverListener->listen(ipAddress,ipPort); 4.声明一个QList对象用于存客户端 QLis

基于Linux下的UDP编程

一. Linux下UDP编程框架 使用UDP进行程序设计可以分为客户端和服务器端两部分. 1.服务器端程序包括: Ø  建立套接字 Ø  将套接字地址结构进行绑定 Ø  读写数据 Ø  关闭套接字 2.客户端程序包括: Ø  建立套接字 Ø  读写数据 Ø  关闭套接字 3.服务器端和客户端程序之间的差别 服务器端和客户端两个流程之间的主要差别在于对地址的绑定函数(bind()函数),而客户端可以不用进行地址和端口的绑定操作. 二.Linux中UDP套接字函数  从图可知,UDP协议的服务端程序

Windows平台VC++ 6.0 下的网络编程学习 - 简单的测试winsock.h头文件

最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自己理解的东西. 1.首先是对Winsock的一点介绍:Winsock是一种标准的API(应用程序编程接口),主要用于网络中的数据通信,它允许两个应用程序在同一台机器上或通过网络相互通信.需要注意的是Winsock和协议无关,使用Winsock编程接口,应用程序可通过普通网络协议如:TCP/IP(网络

Linux下的socket编程实践(十) 基本UDP编程细节

在我的这两篇博客中,简单介绍并实现了基于UDP(TCP)的windows(UNIX下流程基本一致)下的服务端和客户端的程序,本文继续探讨关于UDP编程的一些细节. http://blog.csdn.net/nk_test/article/details/47733307 http://blog.csdn.net/nk_test/article/details/47756381 下图是一个简单的UDP客户/服务器模型: 我在这里也实现了一个简单的UDP回射服务器/客户端: /**实践: 实现一个基

Linux学习四:UDP编程(上)

关于UDP和TCP对比优缺,这里就不说了. 使用UDP代码所掉用的函数和用于TCP的函数非常类似,这主要因为套接口库在底层的TCP和UDP的函数上加了一层抽象,通过这层抽象使得编程更容易,但失去了一些控制. 二者函数调用唯一的实际区别是soceket函数调用的一个参数,TCP的是SOCK_STREAM,UDP的是SOCK_DGRAM,二者都可以使用recvfrom函数,而recv只用于TCP. 当然函数的变化不是这么简单,因为你要从一种有连接的协议转向到无连接的协议上去.这里写个很简单直接的UD

黑马程序员_JAVA UDP网络编程学习笔记

一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的,它们构成了两个端点之间的虚拟通信链路.与TCP通信不同,UDP是面向无连接的.不可靠的基于数据包的传输协议.即应用进程(或程序)在使用UDP协议之前,不必先建立连接.自然,发送数据结束时也没有连接需要释放.因此,减少了开销和发送数据之前的延时.UDP也采用端口来区分进程. 在java中,java.