linux tcp cork,在此用例中,TCP_CORK和TCP_NODELAY是否有显着差异?

在写完关于TCP_NODELAY和TCP_CORK的答案之后,我意识到我必须缺少对TCP_CORK的要点的了解,因为我尚不清楚100%为何Linux开发人员认为有必要引入一个新的TCP_CORK标志,而不是仅仅依靠应用程序在适当的时间设置或清除现有的TCP_NODELAY标志。

特别是,如果我有一个Linux应用程序想要通过TCP流send()一些小/非连续的数据片段,而无需支付200mS

Nagle延迟税,同时将发送所需的数据包数量减到最少它,我可以通过以下两种方式之一进行操作:

使用TCP_CORK(伪代码):

int optval = 1;

setsockopt(sk, SOL_TCP, TCP_CORK, &optval, sizeof(int)); // put a cork in it

send(sk, ..);

send(sk, ..);

send(sk, ..);

optval = 0;

setsockopt(sk, SOL_TCP, TCP_CORK, &optval, sizeof(int)); // release the cork

或使用TCP_NODELAY(伪代码):

int optval = 0;

setsockopt(sk, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof(int)); // turn on Nagle's

send(sk, ..);

send(sk, ..);

send(sk, ..);

optval = 1;

setsockopt(sk, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof(int)); // turn Nagle's back off

多年来,我一直在使用后一种技术,并且效果很好,它的好处是还可以移植到非Linux操作系统(尽管在Linux外部,您必须在关闭Nagle的关闭后再次调用send())以确保立即发送数据包并避免Nagle延迟-

send()为零字节就足够了)。

现在,Linux开发人员很聪明,所以我怀疑他们对TCP_NODELAY的上述使用从未发生过。他们一定有某种理由感到不足,这导致他们引入了新的专有TCP_CORK标志。谁能解释这个原因是什么?

  • 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、付费专栏及课程。

余额充值