CSDN话题挑战赛第2期
参赛话题:Qt应用程序开发

1.QTcpSocket

QTcpSocket类提供了一个TCP socket。

TCP(传输控制协议)是一个可靠的、面向流的、面向连接的传输协议。它特别适用于数据的连续传输。

QTcpSocket是QAbstractSocket的一个便利子类,它允许你建立一个TCP连接并传输数据流。详情请参见:

Roson的Qt之旅#92 QAbstractSocket(Qt套接字基类)_Allen Roson的博客-CSDN博客_qt本地套接字QAbstractSocket使用说明;Qt套接字;Qt Sockethttps://blog.csdn.net/jolin678/article/details/124910073?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166324466916782412537753%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=166324466916782412537753&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-124910073-null-null.nonecase&utm_term=QAbstractSocket&spm=1018.2226.3001.4450

注意:TCP套接字不能以QIODevice::Unbuffered模式打开。
另见QTcpServer, QUdpSocket, QNetworkAccessManager

2.QUdpSocket

2.1概述

QUdpSocket类提供了一个UDP套接字。

UDP(用户数据报协议)是一个轻量级的、不可靠的、面向数据报的、无连接的协议。它可以在可靠性不重要时使用。QUdpSocket是QAbstractSocket的一个子类,允许你发送和接收UDP数据报。

使用这个类的最常见方法是使用bind()绑定到一个地址和端口,然后调用writeDatagram()和readDatagram()/receiveDatagram()来传输数据。如果你想使用标准的QIODevice函数read()、readLine()、write()等,你必须首先通过调用connectToHost()将套接字直接连接到一个对等体。
每次有数据报被写入网络时,套接字都会发出bytesWritten()信号。如果你只是想发送数据报,你不需要调用bind()。

只要有数据报到达,就会发出readyRead()信号。在这种情况下,hasPendingDatagrams()返回true。调用pendingDatagramSize()来获得第一个待发数据报的大小,然后调用readDatagram()或receiveDatagram()来读取它。

注意:当你收到readyRead()信号时,应该读取一个传入的数据报,否则这个信号将不会为下一个数据报发射出来。

例子:

  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()) {QNetworkDatagram datagram = udpSocket->receiveDatagram();processTheDatagram(datagram);}}

QUdpSocket还支持UDP组播。使用joinMulticastGroup()和leaveMulticastGroup()来控制组成员资格,使用QAbstractSocket::MulticastTtlOption和QAbstractSocket::MulticastLoopbackOption来设置TTL和回环套接字选项。使用setMulticastInterface()来控制组播数据报的出站接口,并使用multicastInterface()来查询它。

使用QUdpSocket,你也可以使用connectToHost()建立一个与UDP服务器的虚拟连接,然后使用read()和write()来交换数据报,而不需要为每个数据报指定接收器。

广播发送器、广播接收器、多播发送器和多播接收器的例子说明了如何在应用程序中使用QUdpSocket。

另请参见QTcpSocket和QNetworkDatagram。

2.2成员函数说明

QUdpSocket::QUdpSocket(QObject *parent = Q_NULLPTR)

创建一个QUdpSocket对象。
parent被传递给QObject构造函数。
也请参见socketType()。

[virtual] QUdpSocket::~QUdpSocket()

销毁套接字,必要时关闭连接。
参见close()。

bool QUdpSocket::hasPendingDatagrams() const

如果至少有一个数据报在等待被读取,则返回true,否则返回false。
参见 pendingDatagramSize() 和 readDatagram()。

bool QUdpSocket::joinMulticastGroup(const QHostAddress &groupAddress)

在操作系统选择的默认接口上加入由groupAddress指定的多播组。该套接字必须处于BoundState状态,否则会发生错误。

请注意,如果你试图加入一个IPv4组,你的套接字必须不使用IPv6(或者在双模式下,使用QHostAddress::Any)来绑定。你必须使用QHostAddress::AnyIPv4来代替。

如果成功,该函数返回true;否则返回false并相应地设置套接字错误。

这个函数在Qt 4.8中引入。

参见leaveMulticastGroup()。

bool QUdpSocket::joinMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface)

这是一个重载函数。
加入接口iface上的多播组地址groupAddress。
这个函数在Qt 4.8中引入。
也请参见 leaveMulticastGroup()。

bool QUdpSocket::leaveMulticastGroup(const QHostAddress &groupAddress)

在操作系统选择的默认接口上离开由groupAddress指定的多播组。该套接字必须处于BoundState状态,否则会发生错误。
如果成功,该函数返回true;否则返回false并相应地设置套接字错误。
这个函数在Qt 4.8中引入。
参见joinMulticastGroup()。

bool QUdpSocket::leaveMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface)

这是一个重载函数。
离开接口iface上由groupAddress指定的多播组。
这个函数在Qt 4.8中引入。
参见joinMulticastGroup()。

QNetworkInterface QUdpSocket::multicastInterface() const

返回多播数据报的出站接口。这对应于IPv4套接字的IP_MULTICAST_IF套接字选项和IPv6套接字的IPV6_MULTICAST_IF套接字选项。如果之前没有设置接口,这个函数会返回一个无效的QNetworkInterface。该套接字必须处于BoundState状态,否则将返回一个无效的QNetworkInterface。
这个函数在Qt 4.8中引入。
参见setMulticastInterface()。

qint64 QUdpSocket::pendingDatagramSize() const

返回第一个待处理的UDP数据报的大小。如果没有可用的数据报,该函数返回-1。
参见hasPendingDatagrams()和readDatagram()。

qint64 QUdpSocket::readDatagram(char *data, qint64 maxSize, QHostAddress *address = Q_NULLPTR, quint16 *port = Q_NULLPTR)

接收一个不大于maxSize字节的数据报并将其存储在data中。发送者的主机地址和端口存储在*address和*port中(除非指针为0)。
成功时返回数据报的大小;否则返回-1。
如果maxSize太小,数据报的其余部分将被丢失。为了避免数据丢失,在试图读取数据报之前,应调用pendingDatagramSize()来确定未决数据报的大小。如果maxSize为0,数据报将被丢弃。
参见writeDatagram(), hasPendingDatagrams(), and pendingDatagramSize()。

QNetworkDatagram QUdpSocket::receiveDatagram(qint64 maxSize = -1)

接收一个不超过maxSize字节的数据报,并在QNetworkDatagram对象中返回,同时返回发件人的主机地址和端口。如果可能的话,这个函数还将尝试确定数据报的目的地址、端口和接收时的跳数。
失败时,返回一个报告无效的QNetworkDatagram。
如果maxSize太小,数据报的其余部分将被丢失。如果maxSize为0,数据报将被丢弃。如果maxSize为-1(默认),该函数将尝试读取整个数据报。
参见writeDatagram(), hasPendingDatagrams(), and pendingDatagramSize()。

void QUdpSocket::setMulticastInterface(const QNetworkInterface &iface)

将多播数据包的出站接口设置为接口iface。这对应于IPv4套接字的IP_MULTICAST_IF套接字选项和IPv6套接字的IPV6_MULTICAST_IF套接字选项。该套接字必须处于BoundState状态,否则该函数不做任何事情。
这个函数在Qt 4.8中引入。
参见multicastInterface(), joinMulticastGroup(), and leaveMulticastGroup()。

qint64 QUdpSocket::writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)

将数据报以大小的方式发送到端口端口的主机地址。成功时返回发送的字节数,否则返回-1。
数据报总是被写成一个块。数据报的最大尺寸与平台高度相关,但可以低至8192字节。如果数据报太大,这个函数将返回-1,error()将返回DatagramTooLargeError。

一般来说,发送大于512字节的数据报是不利的,因为即使它们被成功发送,在到达最终目的地之前,它们很可能被IP层分割开来。

警告。在一个连接的UDP套接字上调用这个函数可能会导致错误,并且没有数据包被发送。如果你使用一个连接的套接字,请使用write()来发送数据包。
参见readDatagram()和write()。

qint64 QUdpSocket::writeDatagram(const QNetworkDatagram &datagram)

这是一个重载函数。
将数据报数据报发送到数据报中包含的主机地址和端口号,使用网络接口和跳数限制,也是在这里设置的。如果目标地址和端口号没有设置,该函数将发送至connectToHost()传递的地址。
如果目标地址是IPv6,有一个非空的范围ID,但与数据报中的接口索引不同,则未定义操作系统将选择在哪个接口上发送。

如果成功,该函数返回发送的字节数,如果遇到错误则返回-1。

警告:在一个连接的UDP套接字上调用这个函数可能会导致错误和没有数据包被发送。如果你使用一个连接的套接字,请使用write()来发送数据包。

参见QNetworkDatagram::setDestination(), QNetworkDatagram::setHopLimit(), 和QNetworkDatagram::setInterfaceIndex()。

qint64 QUdpSocket::writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port)

这是一个重载函数。
向主机地址host和端口port发送数据报datagram。
如果成功,该函数返回发送的字节数,如果遇到错误则返回-1。

Roson的Qt之旅 #117 QTcpSocket和QUdpSocket详细介绍相关推荐

  1. Roson的Qt之旅 #129 QNetworkProxyFactory(网络代理工厂)

    CSDN话题挑战赛第2期 参赛话题:Qt应用程序开发 1.详细描述 QNetworkProxyFactory类提供细粒度的代理选择. QNetworkProxyFactory是对QNetworkPro ...

  2. Roson的Qt之旅#71 Qt绘制星空和旋转的星球

    1. 效果图 2. 源代码 2.1 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> ...

  3. Roson的Qt之旅#97 Qt编译报错-Could not determine which “make“ command to run

    如下图所示,当我们在QtCreator中新建一个空白的Qt工程时,需要选择Qt库的版本,默认选择的是MinGW. 如果我们选择了其它的,比如说MSGV2015 64bit,那么当工程建好之后,我们点击 ...

  4. Roson的Qt之旅#56 QTime用法

    1.详细描述 QTime类提供时钟时间函数. QTime对象包含一个时钟时间,即从午夜开始的小时.分钟.秒和毫秒数.它可以从系统时钟中读取当前时间,并测量经过的时间跨度.它提供了比较时间和通过添加毫秒 ...

  5. Roson的Qt之旅#54 Qt去掉程序默认按钮和边框(但依然可拖动和最大最小化)

    1.最终效果展示 2.Qt默认的程序框架介绍 当我们用QtDesigner打开ui文件的时候,可以看到下图,下图是一个QMainWindow的框架,它包含了:菜单栏,工具栏,中心区域,状态栏 接下来, ...

  6. Roson的Qt之旅#49 QML动画之Behavior

    1.继承关系 Behavior和Animation之间不存在继承关系,但是Behavior有一个成员变量是Animation类型的: [default] animation : Animation 2 ...

  7. Roson的Qt之旅 #114 QML Repeater(重复器)

    1.概述 Repeater类型用于创建大量的类似项目.像其他视图类型一样,Repeater有一个模型和一个委托:对于模型中的每个条目,委托被实例化在一个用模型中的数据播种的环境中.重复器项目通常被包围 ...

  8. Roson的Qt之旅#106 QML在图片上方放置按钮并实现点击按钮切换图片

    QML完整代码如下: import QtQuick 2.9 import QtQuick.Window 2.2 import QtQml.Models 2.2 import QtQuick.Contr ...

  9. linux下qt和wine,Ubuntu下安装wine详细介绍

    Ubuntu安装wine一般使用两种方式,源码编译或者从网络源安装. 源码编译安装相对比较稳定,速度快.效率高,但是需要时间编译,相比一分钟的源安装,几十分钟的编译确实很长.源安装是别人已经帮你编译好 ...

  10. QT入门第七天 网络编程TCP/IP/UDP+Http和JSON解析+qt事件软键盘【CSDN最详细】

    网络编程+Http和JSON解析+qt事件软键盘 第一章 QT中的网络编程 [1]涉及到的类 [2]tcp协议的流程 [2.1]服务器的流程 socket-->bind-->listen- ...

最新文章

  1. C# — 通过点击回车执行任务
  2. mysql带AND关键字的多条件查询
  3. gitlab新增ssh
  4. Linux基础:Shell脚本学习
  5. 9道最佳解酒方法[转]
  6. Centos7 中文乱码切换中英字符
  7. C# 3.0新特性初步研究 Part5:匿名类型
  8. 深度学习目标检测网络个人总结
  9. scrapy commandline
  10. python中alpha_如何在Python中设置像素的alpha值
  11. Samba在Ubuntu12.04安装
  12. IT怎么寻求工作机会
  13. 远程工具显示Linux乱码问题解决方案
  14. SQL Server迁移数据库文件(ldfmdf文件)到其他盘
  15. echolife hg8245说明书_华为光猫HG8245设置说明书
  16. UDS诊断系列之一 汽车诊断简介
  17. Python自动化测试框架,谁才是你的唯一?
  18. aspack的简单脱壳,望大牛勿喷。
  19. java 游戏背景mp3音乐_java飞机大战(带背景音乐) 游戏原码下载
  20. Mongo的基本shell操作(大全)

热门文章

  1. HMC5883L手册总结与经验分析 详解
  2. opencv学习笔记(八)-IplImage数据结构
  3. 苹果android怎么设置,天猫魔盒怎么投屏使用 苹果和安卓手机操作设置方法
  4. TF-IDF算法原理和公式
  5. 【好看图标不用愁】吾爱万能软件ICO图标提取器
  6. android 字体显示框架,XUI 一个简洁而又优雅的Android原生UI框架
  7. 模拟实现一个银行的取号机
  8. 关于Albedo贴图、颜色贴图、Metallic 贴图、Specular贴图、法线贴图、视差贴图、凹凸贴图、Height Map高度贴图、AO 贴图Occlusion 贴图、Emission 贴图等
  9. 最炫黑科技还得谷歌!一副眼镜告别学外语,一个地图App在家沉浸式环球游
  10. 非系统盘根目录出现Msdia80.dll文件如何处理