diff options
Diffstat (limited to 'src/network/socket/qabstractsocket.cpp')
-rw-r--r-- | src/network/socket/qabstractsocket.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp index dd6d4fea90b..07712c423e0 100644 --- a/src/network/socket/qabstractsocket.cpp +++ b/src/network/socket/qabstractsocket.cpp @@ -432,6 +432,7 @@ #include "qabstractsocket.h" #include "qabstractsocket_p.h" +#include "qnetworkinterface.h" #include "private/qhostinfo_p.h" @@ -1175,12 +1176,11 @@ bool QAbstractSocketPrivate::readFromSocket() // Read from the socket, store data in the read buffer. char *ptr = buffer.reserve(bytesToRead); qint64 readBytes = socketEngine->read(ptr, bytesToRead); + buffer.chop(bytesToRead - (readBytes < 0 ? qint64(0) : readBytes)); if (readBytes == -2) { // No bytes currently available for reading. - buffer.chop(bytesToRead); return true; } - buffer.chop(bytesToRead - (readBytes < 0 ? qint64(0) : readBytes)); #if defined(QABSTRACTSOCKET_DEBUG) qDebug("QAbstractSocketPrivate::readFromSocket() got %lld bytes, buffer size = %lld", readBytes, buffer.size()); @@ -1500,7 +1500,8 @@ bool QAbstractSocket::bind(const QHostAddress &address, quint16 port, BindMode m return d->bind(address, port, mode); } -bool QAbstractSocketPrivate::bind(const QHostAddress &address, quint16 port, QAbstractSocket::BindMode mode) +bool QAbstractSocketPrivate::bind(const QHostAddress &address, quint16 port, QAbstractSocket::BindMode mode, + const QNetworkInterface *iface) { Q_Q(QAbstractSocket); @@ -1535,6 +1536,10 @@ bool QAbstractSocketPrivate::bind(const QHostAddress &address, quint16 port, QAb socketEngine->setOption(QAbstractSocketEngine::BindExclusively, 0); #endif } +#if QT_CONFIG(networkinterface) + if (iface && iface->isValid()) + socketEngine->setOption(QAbstractSocketEngine::BindInterfaceIndex, iface->index()); +#endif bool result = socketEngine->bind(address, port); cachedSocketDescriptor = socketEngine->socketDescriptor(); |