QAbstractSocket 常用函数详解

QAbstractSocket 是 Qt 网络模块中的一个抽象基类,提供了对 TCP 和 UDP 套接字的基本操作。它是 QTcpSocketQUdpSocket 的父类,封装了套接字的核心功能。以下是对 QAbstractSocket 类中主要方法的详细说明和代码示例。


1. 构造函数与析构函数

QAbstractSocket(QAbstractSocket::SocketType socketType, QObject *parent)
  • 功能:构造一个 QAbstractSocket 对象。
  • 参数
    • socketType:套接字类型(如 QTcpSocketQUdpSocket)。
    • parent:父对象(用于 Qt 对象树管理)。
  • 示例
    QTcpSocket *tcpSocket = new QTcpSocket(this); // 创建一个 TCP 套接字
    
virtual ~QAbstractSocket()
  • 功能:析构函数,释放套接字资源。
  • 示例
    delete tcpSocket; // 释放套接字对象
    

2. 绑定与连接

virtual bool bind(const QHostAddress &address, quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform)
  • 功能:将套接字绑定到指定的地址和端口。
  • 参数
    • address:绑定的 IP 地址。
    • port:绑定的端口号(0 表示自动分配)。
    • mode:绑定模式(如 DefaultForPlatformReuseAddressHint 等)。
  • 返回值:绑定成功返回 true,否则返回 false
  • 示例
    QUdpSocket udpSocket;
    if (udpSocket.bind(QHostAddress::Any, 12345)) {
        qDebug() << "UDP socket bound to port 12345";
    }
    
bool bind(quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform) (since Qt 6.2)
  • 功能:将套接字绑定到指定的端口(使用默认地址)。
  • 示例
    QUdpSocket udpSocket;
    if (udpSocket.bind(12345)) {
        qDebug() << "UDP socket bound to port 12345";
    }
    
bool bind(QHostAddress::SpecialAddress addr, quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform)
  • 功能:将套接字绑定到特殊地址(如 QHostAddress::LocalHost)。
  • 示例
    QUdpSocket udpSocket;
    if (udpSocket.bind(QHostAddress::LocalHost, 12345)) {
        qDebug() << "UDP socket bound to localhost:12345";
    }
    
virtual void connectToHost(const QString &hostName, quint16 port, QIODeviceBase::OpenMode openMode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)
  • 功能:连接到指定的主机和端口。
  • 参数
    • hostName:主机名或 IP 地址。
    • port:端口号。
    • openMode:打开模式(如 ReadWrite)。
    • protocol:网络协议(如 IPv4ProtocolIPv6Protocol)。
  • 示例
    QTcpSocket tcpSocket;
    tcpSocket.connectToHost("example.com", 80);
    if (tcpSocket.waitForConnected()) {
        qDebug() << "Connected to example.com:80";
    }
    
void connectToHost(const QHostAddress &address, quint16 port, QIODeviceBase::OpenMode openMode = ReadWrite)
  • 功能:连接到指定的 IP 地址和端口。
  • 示例
    QTcpSocket tcpSocket;
    tcpSocket.connectToHost(QHostAddress("192.168.1.1"), 8080);
    
virtual void disconnectFromHost()
  • 功能:断开与主机的连接。
  • 示例
    tcpSocket.disconnectFromHost();
    

3. 错误与状态

QAbstractSocket::SocketError error() const
  • 功能:返回最后一次发生的错误。
  • 示例
    if (tcpSocket.error() == QAbstractSocket::ConnectionRefusedError) {
        qDebug() << "Connection refused";
    }
    
bool isValid() const
  • 功能:检查套接字是否有效。
  • 示例
    if (tcpSocket.isValid()) {
        qDebug() << "Socket is valid";
    }
    
QAbstractSocket::SocketState state() const
  • 功能:返回套接字的当前状态(如 ConnectedStateUnconnectedState)。
  • 示例
    if (tcpSocket.state() == QAbstractSocket::ConnectedState) {
        qDebug() << "Socket is connected";
    }
    

4. 地址与端口

QHostAddress localAddress() const
  • 功能:返回套接字的本地地址。
  • 示例
    qDebug() << "Local address:" << tcpSocket.localAddress();
    
quint16 localPort() const
  • 功能:返回套接字的本地端口。
  • 示例
    qDebug() << "Local port:" << tcpSocket.localPort();
    
QHostAddress peerAddress() const
  • 功能:返回对等方的地址。
  • 示例
    qDebug() << "Peer address:" << tcpSocket.peerAddress();
    
quint16 peerPort() const
  • 功能:返回对等方的端口。
  • 示例
    qDebug() << "Peer port:" << tcpSocket.peerPort();
    

5. 缓冲区与数据操作

virtual void setReadBufferSize(qint64 size)
  • 功能:设置读取缓冲区的大小。
  • 示例
    tcpSocket.setReadBufferSize(1024 * 1024); // 设置缓冲区为 1MB
    
qint64 readBufferSize() const
  • 功能:返回读取缓冲区的大小。
  • 示例
    qDebug() << "Read buffer size:" << tcpSocket.readBufferSize();
    
bool flush()
  • 功能:刷新套接字的写缓冲区。
  • 示例
    tcpSocket.flush();
    

6. 其他功能

void abort()
  • 功能:立即关闭套接字并丢弃所有未发送的数据。
  • 示例
    tcpSocket.abort();
    
virtual bool waitForConnected(int msecs = 30000)
  • 功能:等待套接字连接,最多等待 msecs 毫秒。
  • 示例
    if (tcpSocket.waitForConnected(5000)) {
        qDebug() << "Connected!";
    }
    
virtual bool waitForDisconnected(int msecs = 30000)
  • 功能:等待套接字断开连接,最多等待 msecs 毫秒。
  • 示例
    if (tcpSocket.waitForDisconnected(5000)) {
        qDebug() << "Disconnected!";
    }
    

总结

QAbstractSocket 提供了丰富的功能,用于管理套接字连接、数据传输和错误处理。通过其子类 QTcpSocketQUdpSocket,开发者可以轻松实现 TCP 和 UDP 的网络通信。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心瞳几何原语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值