看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;
}