diff options
Diffstat (limited to 'src/network/socket')
-rw-r--r-- | src/network/socket/qabstractsocket.cpp | 17 | ||||
-rw-r--r-- | src/network/socket/qabstractsocket_p.h | 2 | ||||
-rw-r--r-- | src/network/socket/qnet_unix_p.h | 26 | ||||
-rw-r--r-- | src/network/socket/qtcpserver.cpp | 38 | ||||
-rw-r--r-- | src/network/socket/qtcpserver_p.h | 2 | ||||
-rw-r--r-- | src/network/socket/qtcpsocket.cpp | 9 | ||||
-rw-r--r-- | src/network/socket/qtcpsocket.h | 2 |
7 files changed, 79 insertions, 17 deletions
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp index dfce0de865..35b541d739 100644 --- a/src/network/socket/qabstractsocket.cpp +++ b/src/network/socket/qabstractsocket.cpp @@ -559,7 +559,6 @@ QAbstractSocketPrivate::QAbstractSocketPrivate() readBufferMaxSize(0), writeBuffer(QABSTRACTSOCKET_BUFFERSIZE), isBuffered(false), - blockingTimeout(30000), connectTimer(0), disconnectTimer(0), connectTimeElapsed(0), @@ -650,6 +649,8 @@ bool QAbstractSocketPrivate::initSocketLayer(QAbstractSocket::NetworkLayerProtoc return false; } + configureCreatedSocket(); + if (threadData->hasEventDispatcher()) socketEngine->setReceiver(this); @@ -661,6 +662,12 @@ bool QAbstractSocketPrivate::initSocketLayer(QAbstractSocket::NetworkLayerProtoc } /*! \internal +*/ +void QAbstractSocketPrivate::configureCreatedSocket() +{ +} + +/*! \internal Slot connected to the read socket notifier. This slot is called when new data is available for reading, or when the socket has @@ -812,7 +819,7 @@ bool QAbstractSocketPrivate::canWriteNotification() #if defined (QABSTRACTSOCKET_DEBUG) qDebug("QAbstractSocketPrivate::canWriteNotification() flushing"); #endif - int tmp = writeBuffer.size(); + qint64 tmp = writeBuffer.size(); flush(); if (socketEngine) { @@ -872,7 +879,7 @@ bool QAbstractSocketPrivate::flush() return false; } - int nextSize = writeBuffer.nextDataBlockSize(); + qint64 nextSize = writeBuffer.nextDataBlockSize(); const char *ptr = writeBuffer.readPointer(); // Attempt to write it all in one chunk. @@ -1707,9 +1714,9 @@ qint64 QAbstractSocket::bytesToWrite() const { Q_D(const QAbstractSocket); #if defined(QABSTRACTSOCKET_DEBUG) - qDebug("QAbstractSocket::bytesToWrite() == %i", d->writeBuffer.size()); + qDebug("QAbstractSocket::bytesToWrite() == %lld", d->writeBuffer.size()); #endif - return (qint64)d->writeBuffer.size(); + return d->writeBuffer.size(); } /*! diff --git a/src/network/socket/qabstractsocket_p.h b/src/network/socket/qabstractsocket_p.h index 63440b6416..85e82aef47 100644 --- a/src/network/socket/qabstractsocket_p.h +++ b/src/network/socket/qabstractsocket_p.h @@ -130,6 +130,7 @@ public: bool flush(); bool initSocketLayer(QAbstractSocket::NetworkLayerProtocol protocol); + virtual void configureCreatedSocket(); void startConnectingByName(const QString &host); void fetchConnectionParameters(); void setupSocketNotifiers(); @@ -139,7 +140,6 @@ public: QRingBuffer writeBuffer; bool isBuffered; - int blockingTimeout; QTimer *connectTimer; QTimer *disconnectTimer; diff --git a/src/network/socket/qnet_unix_p.h b/src/network/socket/qnet_unix_p.h index 979afb82ba..cd118afd63 100644 --- a/src/network/socket/qnet_unix_p.h +++ b/src/network/socket/qnet_unix_p.h @@ -193,6 +193,32 @@ static inline int qt_safe_sendto(int sockfd, const void *buf, size_t len, int fl return ret; } +static inline int qt_safe_recvmsg(int sockfd, struct msghdr *msg, int flags) +{ + int ret; + + EINTR_LOOP(ret, ::recvmsg(sockfd, msg, flags)); + return ret; +} + +// VxWorks' headers do not specify any const modifiers +static inline int qt_safe_sendmsg(int sockfd, const struct msghdr *msg, int flags) +{ +#ifdef MSG_NOSIGNAL + flags |= MSG_NOSIGNAL; +#else + qt_ignore_sigpipe(); +#endif + + int ret; +#ifdef Q_OS_VXWORKS + EINTR_LOOP(ret, ::sendmsg(sockfd, (struct msghdr *) msg, flags); +#else + EINTR_LOOP(ret, ::sendmsg(sockfd, msg, flags)); +#endif + return ret; +} + QT_END_NAMESPACE #endif // QNET_UNIX_P_H diff --git a/src/network/socket/qtcpserver.cpp b/src/network/socket/qtcpserver.cpp index b41d207947..914c14877e 100644 --- a/src/network/socket/qtcpserver.cpp +++ b/src/network/socket/qtcpserver.cpp @@ -160,6 +160,23 @@ QNetworkProxy QTcpServerPrivate::resolveProxy(const QHostAddress &address, quint /*! \internal */ +void QTcpServerPrivate::configureCreatedSocket() +{ +#if defined(Q_OS_UNIX) + // Under Unix, we want to be able to bind to the port, even if a socket on + // the same address-port is in TIME_WAIT. Under Windows this is possible + // anyway -- furthermore, the meaning of reusable on Windows is different: + // it means that you can use the same address-port for multiple listening + // sockets. + // Don't abort though if we can't set that option. For example the socks + // engine doesn't support that option, but that shouldn't prevent us from + // trying to bind/listen. + socketEngine->setOption(QAbstractSocketEngine::AddressReusable, 1); +#endif +} + +/*! \internal +*/ void QTcpServerPrivate::readNotification() { Q_Q(QTcpServer); @@ -205,6 +222,9 @@ void QTcpServerPrivate::readNotification() QTcpServer::QTcpServer(QObject *parent) : QObject(*new QTcpServerPrivate, parent) { +#if defined(QTCPSERVER_DEBUG) + qDebug("QTcpServer::QTcpServer(%p)", parent); +#endif } /*! @@ -218,6 +238,9 @@ QTcpServer::QTcpServer(QObject *parent) */ QTcpServer::~QTcpServer() { +#if defined(QTCPSERVER_DEBUG) + qDebug("QTcpServer::~QTcpServer()"); +#endif close(); } @@ -226,6 +249,9 @@ QTcpServer::~QTcpServer() QTcpServer::QTcpServer(QTcpServerPrivate &dd, QObject *parent) : QObject(dd, parent) { +#if defined(QTCPSERVER_DEBUG) + qDebug("QTcpServer::QTcpServer(QTcpServerPrivate == %p, parent == %p)", &dd, parent); +#endif } /*! @@ -275,17 +301,7 @@ bool QTcpServer::listen(const QHostAddress &address, quint16 port) if (addr.protocol() == QAbstractSocket::AnyIPProtocol && proto == QAbstractSocket::IPv4Protocol) addr = QHostAddress::AnyIPv4; -#if defined(Q_OS_UNIX) - // Under Unix, we want to be able to bind to the port, even if a socket on - // the same address-port is in TIME_WAIT. Under Windows this is possible - // anyway -- furthermore, the meaning of reusable on Windows is different: - // it means that you can use the same address-port for multiple listening - // sockets. - // Don't abort though if we can't set that option. For example the socks - // engine doesn't support that option, but that shouldn't prevent us from - // trying to bind/listen. - d->socketEngine->setOption(QAbstractSocketEngine::AddressReusable, 1); -#endif + d->configureCreatedSocket(); if (!d->socketEngine->bind(addr, port)) { d->serverSocketError = d->socketEngine->error(); diff --git a/src/network/socket/qtcpserver_p.h b/src/network/socket/qtcpserver_p.h index 415a0e190a..47505e7e91 100644 --- a/src/network/socket/qtcpserver_p.h +++ b/src/network/socket/qtcpserver_p.h @@ -80,6 +80,8 @@ public: QNetworkProxy resolveProxy(const QHostAddress &address, quint16 port); #endif + virtual void configureCreatedSocket(); + // from QAbstractSocketEngineReceiver void readNotification() Q_DECL_OVERRIDE; void closeNotification() Q_DECL_OVERRIDE { readNotification(); } diff --git a/src/network/socket/qtcpsocket.cpp b/src/network/socket/qtcpsocket.cpp index b6072b2909..13865fbc9c 100644 --- a/src/network/socket/qtcpsocket.cpp +++ b/src/network/socket/qtcpsocket.cpp @@ -103,4 +103,13 @@ QTcpSocket::QTcpSocket(QTcpSocketPrivate &dd, QObject *parent) d_func()->isBuffered = true; } +/*! + \internal +*/ +QTcpSocket::QTcpSocket(QAbstractSocket::SocketType socketType, + QTcpSocketPrivate &dd, QObject *parent) + : QAbstractSocket(socketType, dd, parent) +{ +} + QT_END_NAMESPACE diff --git a/src/network/socket/qtcpsocket.h b/src/network/socket/qtcpsocket.h index 3449beeceb..bf5370c976 100644 --- a/src/network/socket/qtcpsocket.h +++ b/src/network/socket/qtcpsocket.h @@ -51,6 +51,8 @@ public: protected: QTcpSocket(QTcpSocketPrivate &dd, QObject *parent = 0); + QTcpSocket(QAbstractSocket::SocketType socketType, QTcpSocketPrivate &dd, + QObject *parent = 0); private: Q_DISABLE_COPY(QTcpSocket) |