# serial-udp-com **Repository Path**: huerli/serial-udp-com ## Basic Information - **Project Name**: serial-udp-com - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-03-10 - **Last Updated**: 2024-11-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 参考 https://blog.csdn.net/ipfpm/article/details/93591905 ## QAbstractSocket ![img.png](img.png) ### 公共类型 || | |:---:|:----------------------------------------------------------------------------------------------------------------------------------------------| |enum| BindFlag { ShareAddress, DontShareAddress, ReuseAddressHint, DefaultForPlatform } | |flags| BindMode | |enum| NetworkLayerProtocol { IPv4Protocol, IPv6Protocol, AnyIPProtocol, UnknownNetworkLayerProtocol } | |enum| PauseMode { PauseNever, PauseOnSslErrors } | |flags| PauseModes | |enum| SocketError { ConnectionRefusedError, RemoteHostClosedError, HostNotFoundError, SocketAccessError, SocketResourceError, …, UnknownSocketError }| |enum| SocketOption { LowDelayOption, KeepAliveOption, MulticastTtlOption, MulticastLoopbackOption, TypeOfServiceOption, …, PathMtuSocketOption } | |enum| SocketState { UnconnectedState, HostLookupState, ConnectingState, ConnectedState, BoundState, …, ListeningState } | |enum| SocketType { TcpSocket, UdpSocket, SctpSocket, UnknownSocketType } | ### 信号 || | |:---:|:----------------------------------------------------------------------------------------------------------------------------------------------| |void|connected()| |void|disconnected()| |void|errorOccurred(QAbstractSocket::SocketError socketError)| |void|hostFound()| |void|proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator)| |void|stateChanged(QAbstractSocket::SocketState socketState)| ## QUdpSocket(QObject *parent = nullptr) ![alt text](image.png) - UDP(用户数据报协议)是一种轻量级、不可靠、面向数据报、无连接的协议。它可以在可靠性不重要的情况下使用。QUdpSocket是QAbstractSocket的一个子类,它允许您发送和接收UDP数据报。 - 使用这个类最常见的方法是使用bind()绑定到一个地址和端口,然后调用writeDatagram()和readDatagram() / receiveDatagram()来传输数据。如果你想使用标准的QIODevice函数read(), readLine(), write()等,你必须首先通过调用connectToHost()将套接字直接连接到对等体。 - 套接字每次将数据报写入网络时都会发出bytesWritten()信号。如果您只想发送数据报,则不需要调用bind()。 - 每当数据报到达时,就会发出readyRead()信号。在这种情况下,hasPendingDatagrams()返回true。调用pendingDatagramSize()来获取第一个挂起数据报的大小,并调用readDatagram()或receiveDatagram()来读取它。 example: ```C++ void Server::initSocket() { udpSocket = new QUdpSocket(this); udpSocket->bind(QHostAddress::LocalHost, 7755); connect(udpSocket, &QUdpSocket::readyRead, this, &Server::readPendingDatagrams); } void Server::readPendingDatagrams() { while (udpSocket->hasPendingDatagrams()) { QNetworkDatagram datagram = udpSocket->receiveDatagram(); processTheDatagram(datagram); } } ``` ### qint64 QUdpSocket::pendingDatagramSize() const - 返回第一个挂起的UDP数据报的大小。如果没有可用的数据报,这个函数返回-1。 ### qint64 QUdpSocket::readDatagram(char *data, qint64 maxSize, QHostAddress *address = nullptr, quint16 *port = nullptr) - 接收不大于maxSize字节的数据报,并将其存储在data中。发送方的主机地址和端口存储在*address和*port中(除非指针为nullptr)。 - 成功时返回数据报的大小;否则返回-1。 - 如果maxSize太小,则数据报的其余部分将丢失。为了避免数据丢失,在尝试读取挂起的数据报之前,调用pendingDatagramSize()来确定它的大小。如果maxSize为0,则丢弃该数据报。 ### QNetworkDatagram QUdpSocket::receiveDatagram(qint64 maxSize = -1) - 接收不大于maxSize字节的数据报,并在QNetworkDatagram对象中返回它,以及发送方的主机地址和端口。如果可能的话,该函数还将尝试确定数据报的目的地址、端口和接收时的跳数。 - 如果失败,则返回一个报告无效的QNetworkDatagram。 - 如果maxSize太小,则数据报的其余部分将丢失。如果maxSize为0,则丢弃该数据报。如果maxSize为-1(默认值),该函数将尝试读取整个数据报。 ### qint64 QUdpSocket::writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port) - 发送大小为size的数据报到端口为port的主机地址地址。返回成功时发送的字节数;否则返回-1。 - 数据报总是作为一个块写入。数据报的最大大小高度依赖于平台,但可以低至8192字节。如果数据报太大,此函数将返回-1,error()将返回DatagramTooLargeError。 - 通常不建议发送大于512字节的数据报,因为即使它们被成功发送,它们也可能在到达最终目的地之前被IP层分片。 ### qint64 QUdpSocket::writeDatagram(const QNetworkDatagram &datagram) - 这是一个重载函数。 - 将数据报发送到数据报中包含的主机地址和端口号,使用网络接口和跳数限制也设置在那里。如果未设置目的地址和端口号,则该函数将发送到传递给connectToHost()的地址。 - 如果目的地址为IPv6,且作用域id非空,但与数据报中的接口索引不同,则不确定操作系统将选择哪个接口发送。 - 如果成功,该函数返回发送的字节数,如果遇到错误,则返回-1。 ### qint64 QUdpSocket::writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port) - 这是一个重载函数。 - 发送数据报数据报到主机地址host和端口port。 - 如果成功,该函数返回发送的字节数,如果遇到错误,则返回-1。