//---------------------------------------------------------------------------------- void tst_QTcpServer::listenWhileListening() { QTcpServer server; QVERIFY(server.listen()); QTest::ignoreMessage(QtWarningMsg, "QTcpServer::listen() called when already listening"); QVERIFY(!server.listen()); }
Utils::Port LocalQmlProfilerRunner::findFreePort(QString &host) { QTcpServer server; if (!server.listen(QHostAddress::LocalHost) && !server.listen(QHostAddress::LocalHostIPv6)) { qWarning() << "Cannot open port on host for QML profiling."; return Utils::Port(); } host = server.serverAddress().toString(); return Utils::Port(server.serverPort()); }
static PyObject *meth_QTcpServer_listen(PyObject *sipSelf, PyObject *sipArgs, PyObject *sipKwds) { PyObject *sipParseErr = NULL; { const QHostAddress& a0def = QHostAddress::Any; const QHostAddress* a0 = &a0def; int a0State = 0; quint16 a1 = 0; QTcpServer *sipCpp; static const char *sipKwdList[] = { sipName_address, sipName_port, }; if (sipParseKwdArgs(&sipParseErr, sipArgs, sipKwds, sipKwdList, NULL, "B|J1t", &sipSelf, sipType_QTcpServer, &sipCpp, sipType_QHostAddress, &a0, &a0State, &a1)) { bool sipRes; Py_BEGIN_ALLOW_THREADS sipRes = sipCpp->listen(*a0,a1); Py_END_ALLOW_THREADS sipReleaseType(const_cast<QHostAddress *>(a0),sipType_QHostAddress,a0State); return PyBool_FromLong(sipRes); } } /* Raise an exception if the arguments couldn't be parsed. */ sipNoMethod(sipParseErr, sipName_QTcpServer, sipName_listen, doc_QTcpServer_listen); return NULL; }
void tst_QTcpServer::proxyFactory() { QFETCH_GLOBAL(bool, setProxy); if (setProxy) return; QFETCH(QList<QNetworkProxy>, proxyList); QFETCH(QNetworkProxy, proxyUsed); QFETCH(bool, fails); MyProxyFactory *factory = new MyProxyFactory; factory->toReturn = proxyList; QNetworkProxyFactory::setApplicationProxyFactory(factory); QTcpServer server; bool listenResult = server.listen(); // Verify that the factory was called properly QCOMPARE(factory->callCount, 1); QCOMPARE(factory->lastQuery, QNetworkProxyQuery(0, QString(), QNetworkProxyQuery::TcpServer)); QCOMPARE(listenResult, !fails); QCOMPARE(server.errorString().isEmpty(), !fails); // note: the following test is not a hard failure. // Sometimes, error codes change for the better QTEST(int(server.serverError()), "expectedError"); }
int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QTcpServer server; if (!server.listen(QHostAddress::LocalHost, 49199)) { qDebug("Failed to listen: %s", server.errorString().toLatin1().constData()); return 1; } #if defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN) QFile file(QLatin1String("/test_signal.txt")); file.open(QIODevice::WriteOnly); file.write("Listening\n"); file.flush(); file.close(); #else printf("Listening\n"); fflush(stdout); #endif server.waitForNewConnection(5000); qFatal("Crash"); return 0; }
//---------------------------------------------------------------------------------- void tst_QTcpServer::waitForConnectionTest() { QFETCH_GLOBAL(bool, setProxy); if (setProxy) { QFETCH_GLOBAL(int, proxyType); if (proxyType == QNetworkProxy::Socks5Proxy) { QSKIP("Localhost servers don't work well with SOCKS5", SkipAll); } } QTcpSocket findLocalIpSocket; findLocalIpSocket.connectToHost(QtNetworkSettings::serverName(), 143); QVERIFY(findLocalIpSocket.waitForConnected(5000)); QTcpServer server; bool timeout = false; QVERIFY(server.listen(findLocalIpSocket.localAddress())); QVERIFY(!server.waitForNewConnection(1000, &timeout)); QCOMPARE(server.serverError(), QAbstractSocket::SocketTimeoutError); QVERIFY(timeout); ThreadConnector connector(findLocalIpSocket.localAddress(), server.serverPort()); connector.start(); #if defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN) QVERIFY(server.waitForNewConnection(9000, &timeout)); #else QVERIFY(server.waitForNewConnection(3000, &timeout)); #endif QVERIFY(!timeout); }
//---------------------------------------------------------------------------------- void tst_QTcpServer::ipv6Server() { #if defined(Q_OS_SYMBIAN) QSKIP("Symbian: IPv6 is not yet supported", SkipAll); #endif //### need to enter the event loop for the server to get the connection ?? ( windows) QTcpServer server; if (!server.listen(QHostAddress::LocalHostIPv6, 8944)) { QVERIFY(server.serverError() == QAbstractSocket::UnsupportedSocketOperationError); return; } QVERIFY(server.serverPort() == 8944); QVERIFY(server.serverAddress() == QHostAddress::LocalHostIPv6); QTcpSocket client; client.connectToHost("::1", 8944); QVERIFY(client.waitForConnected(5000)); QVERIFY(server.waitForNewConnection()); QVERIFY(server.hasPendingConnections()); QTcpSocket *serverSocket = 0; QVERIFY((serverSocket = server.nextPendingConnection())); }
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // get ipv4 address list QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses(); for(int i = 0; i < ipAddressesList.size(); ++i) { QTcpServer testServer; if( ipAddressesList[i].toIPv4Address() && testServer.listen(ipAddressesList[i], 9876) ) { testServer.close(); ui->comboBox->addItem(ipAddressesList[i].toString()); } } ui->lineEditHostname->setText(QHostInfo::localHostName()); IPv4 = ui->comboBox->currentText(); serverPort = ui->spinBoxPort->value(); serverState = ServerStop; runningDay = runningSec = runningMin = runningHour = 0; timer = new QTimer(this); timer->start(1000); // msec db = NULL; server = NULL; connect(timer, SIGNAL(timeout()), this, SLOT(runningTimeChange())); }
void tst_QSocketNotifier::mixingWithTimers() { QTimer timer; timer.setInterval(0); timer.start(); QTcpServer server; QVERIFY(server.listen(QHostAddress::LocalHost, 0)); MixingWithTimersHelper helper(&timer, &server); QCoreApplication::processEvents(); QCOMPARE(helper.timerActivated, true); QCOMPARE(helper.socketActivated, false); helper.timerActivated = false; helper.socketActivated = false; QTcpSocket socket; socket.connectToHost(server.serverAddress(), server.serverPort()); QCoreApplication::processEvents(); QCOMPARE(helper.timerActivated, true); QTRY_COMPARE(helper.socketActivated, true); }
/*------------------------------------------------------------------------------* *------------------------------------------------------------------------------*/ WebProxy::WebProxy() { QTcpServer *proxyServer = new QTcpServer(this); proxyServer->listen(QHostAddress::Any, 8080); connect(proxyServer, SIGNAL(newConnection()), this, SLOT(manageQuery())); qDebug( ) << __FILE__ << __FUNCTION__ << "Proxy server running at port" << proxyServer->serverPort(); } //WebProxy::WebProxy
void LocalQmlProfilerRunnerTest::testFindFreePort() { QUrl serverUrl = Utils::urlFromLocalHostAndFreePort(); QVERIFY(serverUrl.port() != -1); QVERIFY(!serverUrl.host().isEmpty()); QTcpServer server; QVERIFY(server.listen(QHostAddress(serverUrl.host()), serverUrl.port())); }
void LocalQmlProfilerRunnerTest::testFindFreePort() { QString host; Utils::Port port = LocalQmlProfilerRunner::findFreePort(host); QVERIFY(port.isValid()); QVERIFY(!host.isEmpty()); QTcpServer server; QVERIFY(server.listen(QHostAddress(host), port.number())); }
// test only for posix void tst_QSocketNotifier::posixSockets() { QTcpServer server; QVERIFY(server.listen(QHostAddress::LocalHost, 0)); int posixSocket = qt_safe_socket(AF_INET, SOCK_STREAM, 0); sockaddr_in addr; addr.sin_addr.s_addr = htonl(0x7f000001); addr.sin_family = AF_INET; addr.sin_port = htons(server.serverPort()); qt_safe_connect(posixSocket, (const struct sockaddr*)&addr, sizeof(sockaddr_in)); QVERIFY(server.waitForNewConnection(5000)); QScopedPointer<QTcpSocket> passive(server.nextPendingConnection()); ::fcntl(posixSocket, F_SETFL, ::fcntl(posixSocket, F_GETFL) | O_NONBLOCK); { QSocketNotifier rn(posixSocket, QSocketNotifier::Read); connect(&rn, SIGNAL(activated(int)), &QTestEventLoop::instance(), SLOT(exitLoop())); QSignalSpy readSpy(&rn, SIGNAL(activated(int))); QVERIFY(readSpy.isValid()); // No write notifier, some systems trigger write notification on socket creation, but not all QSocketNotifier en(posixSocket, QSocketNotifier::Exception); connect(&en, SIGNAL(activated(int)), &QTestEventLoop::instance(), SLOT(exitLoop())); QSignalSpy errorSpy(&en, SIGNAL(activated(int))); QVERIFY(errorSpy.isValid()); passive->write("hello",6); passive->waitForBytesWritten(5000); QTestEventLoop::instance().enterLoop(3); QCOMPARE(readSpy.count(), 1); QCOMPARE(errorSpy.count(), 0); char buffer[100]; int r = qt_safe_read(posixSocket, buffer, 100); QCOMPARE(r, 6); QCOMPARE(buffer, "hello"); QSocketNotifier wn(posixSocket, QSocketNotifier::Write); connect(&wn, SIGNAL(activated(int)), &QTestEventLoop::instance(), SLOT(exitLoop())); QSignalSpy writeSpy(&wn, SIGNAL(activated(int))); QVERIFY(writeSpy.isValid()); qt_safe_write(posixSocket, "goodbye", 8); QTestEventLoop::instance().enterLoop(3); QCOMPARE(readSpy.count(), 1); QCOMPARE(writeSpy.count(), 1); QCOMPARE(errorSpy.count(), 0); // Write notifier may have fired before the read notifier inside // QTcpSocket, give QTcpSocket a chance to see the incoming data passive->waitForReadyRead(100); QCOMPARE(passive->readAll(), QByteArray("goodbye",8)); } qt_safe_close(posixSocket); }
QTcpServer *KSocketFactory::listen(const QString &protocol, const QHostAddress &address, quint16 port, QObject *parent) { QTcpServer *server = new QTcpServer(parent); #ifndef QT_NO_NETWORKPROXY server->setProxy(proxyForListening(protocol)); #endif server->listen(address, port); return server; }
bool WinRtDebugSupport::getFreePort(quint16 &qmlDebuggerPort, QString *errorMessage) { QTcpServer server; if (!server.listen(QHostAddress::LocalHost, qmlDebuggerPort)) { *errorMessage = tr("Not enough free ports for QML debugging."); return false; } qmlDebuggerPort = server.serverPort(); return true; }
void tst_QSocketNotifier::posixSockets() { #ifndef Q_OS_UNIX QSKIP("test only for posix", SkipAll); #else QTcpServer server; QVERIFY(server.listen(QHostAddress::LocalHost, 0)); int posixSocket = qt_safe_socket(AF_INET, SOCK_STREAM, 0); sockaddr_in addr; addr.sin_addr.s_addr = htonl(0x7f000001); addr.sin_family = AF_INET; addr.sin_port = htons(server.serverPort()); qt_safe_connect(posixSocket, (const struct sockaddr*)&addr, sizeof(sockaddr_in)); QVERIFY(server.waitForNewConnection(5000)); QScopedPointer<QTcpSocket> passive(server.nextPendingConnection()); ::fcntl(posixSocket, F_SETFL, ::fcntl(posixSocket, F_GETFL) | O_NONBLOCK); { QSocketNotifier rn(posixSocket, QSocketNotifier::Read); connect(&rn, SIGNAL(activated(int)), &QTestEventLoop::instance(), SLOT(exitLoop())); QSignalSpy readSpy(&rn, SIGNAL(activated(int))); QSocketNotifier wn(posixSocket, QSocketNotifier::Write); connect(&wn, SIGNAL(activated(int)), &QTestEventLoop::instance(), SLOT(exitLoop())); QSignalSpy writeSpy(&wn, SIGNAL(activated(int))); QSocketNotifier en(posixSocket, QSocketNotifier::Exception); connect(&en, SIGNAL(activated(int)), &QTestEventLoop::instance(), SLOT(exitLoop())); QSignalSpy errorSpy(&en, SIGNAL(activated(int))); passive->write("hello",6); passive->waitForBytesWritten(5000); QTestEventLoop::instance().enterLoop(3); QCOMPARE(readSpy.count(), 1); writeSpy.clear(); //depending on OS, write notifier triggers on creation or not. QCOMPARE(errorSpy.count(), 0); char buffer[100]; qt_safe_read(posixSocket, buffer, 100); QCOMPARE(buffer, "hello"); qt_safe_write(posixSocket, "goodbye", 8); QTestEventLoop::instance().enterLoop(3); QCOMPARE(readSpy.count(), 1); QCOMPARE(writeSpy.count(), 1); QCOMPARE(errorSpy.count(), 0); QCOMPARE(passive->readAll(), QByteArray("goodbye",8)); } qt_safe_close(posixSocket); #endif }
bool DesignerExternalEditor::startEditor(const QString &fileName, QString *errorMessage) { EditorLaunchData data; // Find the editor binary if (!getEditorLaunchData(fileName, &QtSupport::BaseQtVersion::designerCommand, QLatin1String(designerBinaryC), QStringList(), false, &data, errorMessage)) { return false; } // Known one? const ProcessCache::iterator it = m_processCache.find(data.binary); if (it != m_processCache.end()) { // Process is known, write to its socket to cause it to open the file if (debug) qDebug() << Q_FUNC_INFO << "\nWriting to socket:" << data.binary << fileName; QTcpSocket *socket = it.value(); if (!socket->write(fileName.toUtf8() + '\n')) { *errorMessage = tr("Qt Designer is not responding (%1).").arg(socket->errorString()); return false; } return true; } // No process yet. Create socket & launch the process QTcpServer server; if (!server.listen(QHostAddress::LocalHost)) { *errorMessage = tr("Unable to create server socket: %1").arg(server.errorString()); return false; } const quint16 port = server.serverPort(); if (debug) qDebug() << Q_FUNC_INFO << "\nLaunching server:" << port << data.binary << fileName; // Start first one with file and socket as '-client port file' // Wait for the socket listening data.arguments.push_front(QString::number(port)); data.arguments.push_front(QLatin1String("-client")); if (!startEditorProcess(data, errorMessage)) return false; // Set up signal mapper to track process termination via socket if (!m_terminationMapper) { m_terminationMapper = new QSignalMapper(this); connect(m_terminationMapper, SIGNAL(mapped(QString)), this, SLOT(processTerminated(QString))); } // Insert into cache if socket is created, else try again next time if (server.waitForNewConnection(3000)) { QTcpSocket *socket = server.nextPendingConnection(); socket->setParent(this); m_processCache.insert(data.binary, socket); m_terminationMapper->setMapping(socket, data.binary); connect(socket, SIGNAL(disconnected()), m_terminationMapper, SLOT(map())); connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), m_terminationMapper, SLOT(map())); } return true; }
AndroidRunnerWorkerBase::AndroidRunnerWorkerBase(RunControl *runControl, const AndroidRunnable &runnable) : m_androidRunnable(runnable) , m_adbLogcatProcess(nullptr, deleter) , m_psIsAlive(nullptr, deleter) , m_logCatRegExp(regExpLogcat) , m_gdbServerProcess(nullptr, deleter) , m_jdbProcess(nullptr, deleter) { auto runConfig = runControl->runConfiguration(); auto aspect = runConfig->extraAspect<Debugger::DebuggerRunConfigurationAspect>(); Core::Id runMode = runControl->runMode(); const bool debuggingMode = runMode == ProjectExplorer::Constants::DEBUG_RUN_MODE; m_useCppDebugger = debuggingMode && aspect->useCppDebugger(); if (debuggingMode && aspect->useQmlDebugger()) m_qmlDebugServices = QmlDebug::QmlDebuggerServices; else if (runMode == ProjectExplorer::Constants::QML_PROFILER_RUN_MODE) m_qmlDebugServices = QmlDebug::QmlProfilerServices; else if (runMode == ProjectExplorer::Constants::QML_PREVIEW_RUN_MODE) m_qmlDebugServices = QmlDebug::QmlPreviewServices; else m_qmlDebugServices = QmlDebug::NoQmlDebugServices; m_localGdbServerPort = Utils::Port(5039); QTC_CHECK(m_localGdbServerPort.isValid()); if (m_qmlDebugServices != QmlDebug::NoQmlDebugServices) { QTcpServer server; QTC_ASSERT(server.listen(QHostAddress::LocalHost) || server.listen(QHostAddress::LocalHostIPv6), qDebug() << tr("No free ports available on host for QML debugging.")); m_qmlServer.setScheme(Utils::urlTcpScheme()); m_qmlServer.setHost(server.serverAddress().toString()); m_qmlServer.setPort(server.serverPort()); } m_adb = AndroidConfigurations::currentConfig().adbToolPath().toString(); m_localJdbServerPort = Utils::Port(5038); QTC_CHECK(m_localJdbServerPort.isValid()); auto target = runConfig->target(); m_deviceSerialNumber = AndroidManager::deviceSerialNumber(target); m_apiLevel = AndroidManager::deviceApiLevel(target); }
//---------------------------------------------------------------------------------- void tst_QTcpServer::ipv4LoopbackPerformanceTest() { QFETCH_GLOBAL(bool, setProxy); if (setProxy) return; QTcpServer server; QVERIFY(server.listen(QHostAddress::LocalHost)); QVERIFY(server.isListening()); QTcpSocket clientA; clientA.connectToHost(QHostAddress::LocalHost, server.serverPort()); QVERIFY(clientA.waitForConnected(5000)); QVERIFY(clientA.state() == QAbstractSocket::ConnectedState); QVERIFY(server.waitForNewConnection()); QTcpSocket *clientB = server.nextPendingConnection(); QVERIFY(clientB); QByteArray buffer(16384, '@'); QTime stopWatch; stopWatch.start(); qlonglong totalWritten = 0; while (stopWatch.elapsed() < 5000) { QVERIFY(clientA.write(buffer.data(), buffer.size()) > 0); clientA.flush(); totalWritten += buffer.size(); while (clientB->waitForReadyRead(100)) { if (clientB->bytesAvailable() == 16384) break; } clientB->read(buffer.data(), buffer.size()); clientB->write(buffer.data(), buffer.size()); clientB->flush(); totalWritten += buffer.size(); while (clientA.waitForReadyRead(100)) { if (clientA.bytesAvailable() == 16384) break; } clientA.read(buffer.data(), buffer.size()); } qDebug("\t\t%s: %.1fMB/%.1fs: %.1fMB/s", server.serverAddress().toString().toLatin1().constData(), totalWritten / (1024.0 * 1024.0), stopWatch.elapsed() / 1000.0, (totalWritten / (stopWatch.elapsed() / 1000.0)) / (1024 * 1024)); delete clientB; }
bool CHttpServer::Listen(int Port) { QTcpServer* pListener = new QTcpServer(this); pListener->listen(QHostAddress::Any, Port); if (!pListener->isListening()) { delete pListener; return false; } connect(pListener, SIGNAL(newConnection()), this, SLOT(OnConnection())); m_Listners.insert(Port, pListener); return true; }
//---------------------------------------------------------------------------------- void tst_QTcpServer::listenError() { QFETCH_GLOBAL(bool, setProxy); if (setProxy) { QFETCH_GLOBAL(int, proxyType); if (proxyType == QNetworkProxy::Socks5Proxy) { QSKIP("With socks5 we can not make hard requirements on the address or port", SkipAll); } } QTcpServer server; QVERIFY(!server.listen(QHostAddress("1.2.3.4"), 0)); QCOMPARE(server.serverError(), QAbstractSocket::SocketAddressNotAvailableError); QCOMPARE(server.errorString().toLatin1().constData(), "The address is not available"); }
QTcpServer* DccCommon::createServerSocketAndListen( QObject* parent, QString* failedReason, int minPort, int maxPort ) { QTcpServer* socket = new QTcpServer( parent ); if ( minPort > 0 && maxPort >= minPort ) // ports are configured manually { // set port bool found = false; // whether succeeded to set port for ( int port = minPort; port <= maxPort ; ++port ) { bool success = socket->listen( QHostAddress::Any, port ); if ( ( found = ( success && socket->isListening() ) ) ) break; socket->close(); } if ( !found ) { if ( failedReason ) *failedReason = i18n( "No vacant port" ); delete socket; return 0; } } else { // Let the operating system choose a port if ( !socket->listen() ) { if ( failedReason ) *failedReason = i18n( "Could not open a socket" ); delete socket; return 0; } } return socket; }
//---------------------------------------------------------------------------------- void tst_QTcpServer::ipv4PerformanceTest() { QTcpSocket probeSocket; probeSocket.connectToHost(QtNetworkSettings::serverName(), 143); QVERIFY(probeSocket.waitForConnected(5000)); QTcpServer server; QVERIFY(server.listen(probeSocket.localAddress(), 0)); QTcpSocket clientA; clientA.connectToHost(server.serverAddress(), server.serverPort()); QVERIFY(clientA.waitForConnected(5000)); QVERIFY(server.waitForNewConnection(5000)); QTcpSocket *clientB = server.nextPendingConnection(); QVERIFY(clientB); QByteArray buffer(16384, '@'); QTime stopWatch; stopWatch.start(); qlonglong totalWritten = 0; while (stopWatch.elapsed() < 5000) { qlonglong writtenA = clientA.write(buffer.data(), buffer.size()); clientA.flush(); totalWritten += buffer.size(); while (clientB->waitForReadyRead(100)) { if (clientB->bytesAvailable() == writtenA) break; } clientB->read(buffer.data(), buffer.size()); qlonglong writtenB = clientB->write(buffer.data(), buffer.size()); clientB->flush(); totalWritten += buffer.size(); while (clientA.waitForReadyRead(100)) { if (clientA.bytesAvailable() == writtenB) break; } clientA.read(buffer.data(), buffer.size()); } qDebug("\t\t%s: %.1fMB/%.1fs: %.1fMB/s", probeSocket.localAddress().toString().toLatin1().constData(), totalWritten / (1024.0 * 1024.0), stopWatch.elapsed() / 1000.0, (totalWritten / (stopWatch.elapsed() / 1000.0)) / (1024 * 1024)); delete clientB; }
void tst_QTcpServer::addressReusable() { #if defined(Q_OS_SYMBIAN) && defined(Q_CC_NOKIAX86) QSKIP("Symbian: Emulator does not support process launching", SkipAll ); #endif #if defined(QT_NO_PROCESS) QSKIP("Qt was compiled with QT_NO_PROCESS", SkipAll); #else QFETCH_GLOBAL(bool, setProxy); if (setProxy) { QFETCH_GLOBAL(int, proxyType); if (proxyType == QNetworkProxy::Socks5Proxy) { QSKIP("With socks5 this test does not make senans at the momment", SkipAll); } } #if defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN) QString signalName = QString::fromLatin1("/test_signal.txt"); QFile::remove(signalName); // The crashingServer process will crash once it gets a connection. QProcess process; process.start("crashingServer/crashingServer"); int waitCount = 5; while (waitCount-- && !QFile::exists(signalName)) QTest::qWait(1000); QVERIFY(QFile::exists(signalName)); QFile::remove(signalName); #else // The crashingServer process will crash once it gets a connection. QProcess process; process.start("crashingServer/crashingServer"); QVERIFY(process.waitForReadyRead(5000)); #endif QTcpSocket socket; socket.connectToHost(QHostAddress::LocalHost, 49199); QVERIFY(socket.waitForConnected(5000)); QVERIFY(process.waitForFinished(5000)); // Give the system some time. QTest::qSleep(10); QTcpServer server; QVERIFY(server.listen(QHostAddress::LocalHost, 49199)); #endif }
int ServerManager::createListeningSocket(const QHostAddress &address, quint16 port) { int sd = 0; QTcpServer server; if (!server.listen(address, port)) { qCritical("listen failed"); return sd; } sd = ::fcntl(server.socketDescriptor(), F_DUPFD, 0); #if defined(FD_CLOEXEC) ::fcntl(sd, F_SETFD, 0); #endif server.close(); return sd; }
//---------------------------------------------------------------------------------- void tst_QTcpServer::clientServerLoop() { QTcpServer server; QSignalSpy spy(&server, SIGNAL(newConnection())); QVERIFY(!server.isListening()); QVERIFY(!server.hasPendingConnections()); QVERIFY(server.listen(QHostAddress::Any, 11423)); QVERIFY(server.isListening()); QTcpSocket client; QHostAddress serverAddress = QHostAddress::LocalHost; if (!(server.serverAddress() == QHostAddress::Any)) serverAddress = server.serverAddress(); client.connectToHost(serverAddress, server.serverPort()); QVERIFY(client.waitForConnected(5000)); QVERIFY(server.waitForNewConnection(5000)); QVERIFY(server.hasPendingConnections()); QCOMPARE(spy.count(), 1); QTcpSocket *serverSocket = server.nextPendingConnection(); QVERIFY(serverSocket != 0); QVERIFY(serverSocket->write("Greetings, client!\n", 19) == 19); serverSocket->flush(); QVERIFY(client.waitForReadyRead(5000)); QByteArray arr = client.readAll(); QCOMPARE(arr.constData(), "Greetings, client!\n"); QVERIFY(client.write("Well, hello to you!\n", 20) == 20); client.flush(); QVERIFY(serverSocket->waitForReadyRead(5000)); arr = serverSocket->readAll(); QCOMPARE(arr.constData(), "Well, hello to you!\n"); }
void NetworkDialog::slotOkClicked() { m_okButton->setEnabled(false); m_feedback->show(); if (m_client) { m_feedback->setText(i18n("Connecting to remote host...")); m_socket = new QTcpSocket; connect(m_socket, &QTcpSocket::connected, this, &NetworkDialog::clientOK); connect(m_socket, static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)>(&QTcpSocket::error), this, &NetworkDialog::clientError); m_socket->connectToHost(m_hostname->text(), m_port->value()); } else { m_feedback->setText(i18n("Waiting for an incoming connection...")); QTcpServer* server = new QTcpServer; connect(server, &QTcpServer::newConnection, this, &NetworkDialog::serverOK); m_publisher=new KDNSSD::PublicService(nickname(), QLatin1Literal("_kbattleship._tcp"), m_port->value()); m_publisher->publishAsync(); server->listen(QHostAddress::Any, static_cast<quint16>(m_port->value())); } }
/*! Listen a port for connections on a socket. This function must be called in a tfmanager process. */ int TApplicationServerBase::nativeListen(const QHostAddress &address, quint16 port, OpenFlag flag) { int sd = 0; QTcpServer server; if (!server.listen(address, port)) { tSystemError("Listen failed port:%d", port); return sd; } sd = duplicateSocket(server.socketDescriptor()); // duplicate if (flag == CloseOnExec) { ::fcntl(sd, F_SETFD, ::fcntl(sd, F_GETFD) | FD_CLOEXEC); } else { ::fcntl(sd, F_SETFD, 0); // clear } ::fcntl(sd, F_SETFL, ::fcntl(sd, F_GETFL) | O_NONBLOCK); // non-block server.close(); return sd; }
// Test buffered socket being properly closed on remote disconnect void tst_QAbstractSocket::serverDisconnectWithBuffered() { QTcpServer tcpServer; #ifndef QT_NO_SSL QSslSocket testSocket; #else QTcpSocket testSocket; #endif QVERIFY(tcpServer.listen(QHostAddress::LocalHost)); testSocket.connectToHost(tcpServer.serverAddress(), tcpServer.serverPort()); // Accept connection on server side QVERIFY(tcpServer.waitForNewConnection(5000)); QTcpSocket *newConnection = tcpServer.nextPendingConnection(); // Send one char and drop link QVERIFY(newConnection != NULL); QVERIFY(newConnection->putChar(0)); QVERIFY(newConnection->flush()); delete newConnection; QVERIFY(testSocket.waitForConnected(5000)); // ready for write QVERIFY(testSocket.state() == QAbstractSocket::ConnectedState); QSignalSpy spyStateChanged(&testSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState))); QSignalSpy spyDisconnected(&testSocket, SIGNAL(disconnected())); QVERIFY(testSocket.waitForReadyRead(5000)); // have one char already in internal buffer char buf[128]; QCOMPARE(testSocket.read(buf, sizeof(buf)), Q_INT64_C(1)); if (testSocket.state() != QAbstractSocket::UnconnectedState) { QVERIFY(testSocket.waitForDisconnected(5000)); QVERIFY(testSocket.state() == QAbstractSocket::UnconnectedState); } // Test signal emitting QVERIFY(spyDisconnected.count() == 1); QVERIFY(spyStateChanged.count() > 0); QVERIFY(qvariant_cast<QAbstractSocket::SocketState>(spyStateChanged.last().first()) == QAbstractSocket::UnconnectedState); }
void tst_QSocketNotifier::bogusFds() { #ifndef Q_OS_SYMBIAN //behaviour of QSocketNotifier with an invalid fd is totally different across OS //main point of this test was to check symbian backend doesn't crash QSKIP("test only for symbian", SkipAll); #else QTest::ignoreMessage(QtWarningMsg, "QSocketNotifier: Internal error"); QSocketNotifier max(std::numeric_limits<int>::max(), QSocketNotifier::Read); QTest::ignoreMessage(QtWarningMsg, "QSocketNotifier: Invalid socket specified"); QTest::ignoreMessage(QtWarningMsg, "QSocketNotifier: Internal error"); QSocketNotifier min(std::numeric_limits<int>::min(), QSocketNotifier::Write); QTest::ignoreMessage(QtWarningMsg, "QSocketNotifier: Internal error"); //bogus magic number is the first pseudo socket descriptor from symbian socket engine. QSocketNotifier bogus(0x40000000, QSocketNotifier::Exception); QSocketNotifier largestlegal(FD_SETSIZE - 1, QSocketNotifier::Read); QSignalSpy maxspy(&max, SIGNAL(activated(int))); QSignalSpy minspy(&min, SIGNAL(activated(int))); QSignalSpy bogspy(&bogus, SIGNAL(activated(int))); QSignalSpy llspy(&largestlegal, SIGNAL(activated(int))); //generate some unrelated socket activity QTcpServer server; QVERIFY(server.listen(QHostAddress::LocalHost)); connect(&server, SIGNAL(newConnection()), &QTestEventLoop::instance(), SLOT(exitLoop())); QTcpSocket client; client.connectToHost(QHostAddress::LocalHost, server.serverPort()); QTestEventLoop::instance().enterLoop(5); QVERIFY(server.hasPendingConnections()); //check no activity on bogus notifiers QCOMPARE(maxspy.count(), 0); QCOMPARE(minspy.count(), 0); QCOMPARE(bogspy.count(), 0); QCOMPARE(llspy.count(), 0); #endif }