• 12976阅读
  • 6回复

Qt的socket中如何设置TCP_NO_DELAY? [复制链接]

上一主题 下一主题
离线fafasa
 
只看楼主 倒序阅读 楼主  发表于: 2011-06-13
如题
离线oscarboycn

只看该作者 1楼 发表于: 2011-06-14
http://www.21ic.com
http://bbs.eetop.cn
http://www.eetop.cn/
http://www.eet-china.com/
http://www.netyi.net/
http://www.pcbbbs.com/
http://www.pcbtech.net/
离线fafasa
只看该作者 2楼 发表于: 2011-06-16
引用第1楼oscarboycn于2011-06-14 14:01发表的  :
http://www.qtcn.org/bbs/read-htm-tid-36869.html

   tcpSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1);    
是QT4中的方法。QT3中没有setSocketOptionz方法。我的系统是QT3。
离线oscarboycn

只看该作者 3楼 发表于: 2011-06-16
看QT4的源代码中
void QAbstractSocket::setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value)
{
#ifndef QT_NO_OPENSSL
    if (QSslSocket *sslSocket = qobject_cast<QSslSocket*>(this)) {
        sslSocket->setSocketOption(option, value);
        return;
    }
#endif

    if (!d_func()->socketEngine)
        return;

    switch (option) {
        case LowDelayOption:
            d_func()->socketEngine->setOption(QAbstractSocketEngine::LowDelayOption, value.toInt());
            break;

        case KeepAliveOption:
            d_func()->socketEngine->setOption(QAbstractSocketEngine::KeepAliveOption, value.toInt());
            break;
    }
}

/*! \internal
    Sets the socket option \a opt to \a v.
*/
bool QNativeSocketEnginePrivate::setOption(QNativeSocketEngine::SocketOption opt, int v)
{
    Q_Q(const QNativeSocketEngine);
    if (!q->isValid())
        return false;

    int n = 0;
    int level = SOL_SOCKET; // default

    switch (opt) {
    case QNativeSocketEngine::ReceiveBufferSocketOption:
        n = SO_RCVBUF;
        break;
    case QNativeSocketEngine::SendBufferSocketOption:
        n = SO_SNDBUF;
        break;
    case QNativeSocketEngine::BroadcastSocketOption:
        n = SO_BROADCAST;
        break;
    case QNativeSocketEngine::NonBlockingSocketOption:
        {
        unsigned long buf = v;
        unsigned long outBuf;
        DWORD sizeWritten = 0;
        if (::WSAIoctl(socketDescriptor, FIONBIO, &buf, sizeof(unsigned long), &outBuf, sizeof(unsigned long), &sizeWritten, 0,0) == SOCKET_ERROR) {
            WS_ERROR_DEBUG(WSAGetLastError());
            return false;
        }
        return true;
        break;
        }
    case QNativeSocketEngine::AddressReusable:
        n = SO_REUSEADDR;
        break;
    case QNativeSocketEngine::BindExclusively:
        n = SO_EXCLUSIVEADDRUSE;
        break;
    case QNativeSocketEngine::ReceiveOutOfBandData:
        n = SO_OOBINLINE;
        break;
    case QNativeSocketEngine::LowDelayOption:
        level = IPPROTO_TCP;
        n = TCP_NODELAY;
        break;
    case QNativeSocketEngine::KeepAliveOption:
        n = SO_KEEPALIVE;
        break;
    }

    if (::setsockopt(socketDescriptor, level, n, (char*)&v, sizeof(v)) != 0) {
        WS_ERROR_DEBUG(WSAGetLastError());
        return false;
    }
    return true;
}
http://www.21ic.com
http://bbs.eetop.cn
http://www.eetop.cn/
http://www.eet-china.com/
http://www.netyi.net/
http://www.pcbbbs.com/
http://www.pcbtech.net/
离线oscarboycn

只看该作者 4楼 发表于: 2011-06-16
WINDOWS版本最后调用的是WIN API函数
::setsockopt(socketDescriptor, level, n, (char*)&v, sizeof(v)) != 0
http://www.21ic.com
http://bbs.eetop.cn
http://www.eetop.cn/
http://www.eet-china.com/
http://www.netyi.net/
http://www.pcbbbs.com/
http://www.pcbtech.net/
离线oscarboycn

只看该作者 5楼 发表于: 2011-06-16
如果Qt3没有提供的话,那估计就没法把NO_DELAY选项传递给windows的API了

(windows为例)
http://www.21ic.com
http://bbs.eetop.cn
http://www.eetop.cn/
http://www.eet-china.com/
http://www.netyi.net/
http://www.pcbbbs.com/
http://www.pcbtech.net/
离线oscarboycn

只看该作者 6楼 发表于: 2011-06-16
Qt3的socket () 函数是不是返回的是socket描述符?

如果是的话,调用::setsockopt(socketDescriptor, level, n, (char*)&v, sizeof(v))应该可以。。
http://www.21ic.com
http://bbs.eetop.cn
http://www.eetop.cn/
http://www.eet-china.com/
http://www.netyi.net/
http://www.pcbbbs.com/
http://www.pcbtech.net/
快速回复
限100 字节
 
上一个 下一个