TCP_CORK解析

setsockopt (fd, SOL_TCP, TCP_CORK, &on, sizeof (on)); /* cork */
socket设置TCP_CORK该字段的作用:

    现在让我们假设某个应用程序发出了一个请求,希望发送小块数据。我们可以选择立即发送数据或者等待产生更多的数据然后再一次发送两种策略。如果我们马上发送数据,那么交互性的以及客户/服务器型的应用程序将极大地受益。例如,当我们正在发送一个较短的请求并且等候较大的响应时,相关过载与传输的数据总量相比就会比较低,而且,如果请求立即发出那么响应时间也会快一些。以上操作可以通过设置套接字的TCP_NODELAY选项来完成,这样就禁用了Nagle 算法。
另外一种情况则需要我们等到数据量达到最大时才通过网络一次发送全部数据,这种数据传输方式有益于大量数据的通信性能,典型的应用就是文件服务器。应用 Nagle算法在这种情况下就会产生问题。但是,如果你正在发送大量数据,你可以设置TCP_CORK选项禁用Nagle化,其方式正好同 TCP_NODELAY相反(TCP_CORK 和 TCP_NODELAY 是互相排斥的)。下面就让我们仔细分析下其工作原理。

    假设应用程序使用sendfile()函数来转移大量数据。应用协议通常要求发送某些信息来预先解释数据,这些信息其实就是报头内容。典型情况下报头很小,而且套接字上设置了TCP_NODELAY。有报头的包将被立即传输,在某些情况下(取决于内部的包计数器),因为这个包成功地被对方收到后需要请求对方确认。这样,大量数据的传输就会被推迟而且产生了不必要的网络流量交换。

    但是,如果我们在套接字上设置了TCP_CORK(可以比喻为在管道上插入“塞子”)选项,具有报头的包就会填补大量的数据,所有的数据都根据大小自动地通过包传输出去。当数据传输完成时,最好取消TCP_CORK 选项设置给连接“拔去塞子”以便任一部分的帧都能发送出去。这同“塞住”网络连接同等重要。
总而言之,如果你肯定能一起发送多个数据集合(例如HTTP响应的头和正文),那么我们建议你设置TCP_CORK选项,这样在这些数据之间不存在延迟。能极大地有益于WWW、FTP以及文件服务器的性能,同时也简化了你的工作。

简而言之:
TCP_NODELAY:字段是产生一个数据就发送 例如:产生一个mail头就发送出去了
TCP_CORK:数据产生达到最大时候(数据集合)一起发送 例如:产生一个mail头接着一个mail内容等等一起发出去 像在网络上的一个阀门

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Qt 中可以使用 QTcpSocket 类来实现 TCP 断开重连的功能。具体实现步骤如下: 1. 创建一个 QTcpSocket 对象。 ``` QTcpSocket *socket = new QTcpSocket(this); ``` 2. 连接服务器。 ``` socket->connectToHost(host, port); ``` 3. 在连接成功的槽函数中,设置一些连接参数,如超时时间和重连次数等。 ``` void connected() { socket->setSocketOption(QAbstractSocket::KeepAliveOption, 1); socket->setSocketOption(QAbstractSocket::LowDelayOption, 1); socket->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption, 1024 * 1024); socket->setSocketOption(QAbstractSocket::SendBufferSizeSocketOption, 1024 * 1024); socket->setSocketOption(QAbstractSocket::SocketOption(0x00030000), 1); // TCP_NODELAY socket->setSocketOption(QAbstractSocket::SocketOption(0x00040000), 1); // TCP_CORK socket->setSocketOption(QAbstractSocket::SocketOption(0x00080000), 1); // TCP_QUICKACK connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError))); connect(socket, SIGNAL(disconnected()), this, SLOT(onDisconnected())); m_reconnectCount = 0; } ``` 4. 在断开连接的槽函数中,根据需要进行重连操作。 ``` void onDisconnected() { if (m_reconnectCount < m_maxReconnectCount) { ++m_reconnectCount; QTimer::singleShot(m_reconnectInterval, this, SLOT(reconnect())); } else { qDebug() << "Maximum retry count reached"; } } void reconnect() { qDebug() << "Reconnecting..."; socket->connectToHost(host, port); } ``` 5. 在错误处理的槽函数中,如果是连接超时等错误,也可以进行重连操作。 ``` void onError(QAbstractSocket::SocketError error) { if (error == QAbstractSocket::ConnectionRefusedError || error == QAbstractSocket::RemoteHostClosedError || error == QAbstractSocket::SocketTimeoutError) { if (m_reconnectCount < m_maxReconnectCount) { ++m_reconnectCount; QTimer::singleShot(m_reconnectInterval, this, SLOT(reconnect())); } else { qDebug() << "Maximum retry count reached"; } } else { qDebug() << "Socket error:" << error; } } ``` 注意:在进行重连操作时,需要考虑一些细节问题,如重连次数、重连间隔等。此外,如果重连过程中发现了一些错误,也需要及时处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值