Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/network/socket/qtcpserver.cpp |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||
---|---|---|---|---|---|---|---|---|
1 | - | |||||||
2 | - | |||||||
3 | - | |||||||
4 | - | |||||||
5 | - | |||||||
6 | QTcpServerPrivate::QTcpServerPrivate() | - | ||||||
7 | : port(0) | - | ||||||
8 | , state(QAbstractSocket::UnconnectedState) | - | ||||||
9 | , socketEngine(0) | - | ||||||
10 | , serverSocketError(QAbstractSocket::UnknownSocketError) | - | ||||||
11 | , maxConnections(30) | - | ||||||
12 | { | - | ||||||
13 | } | - | ||||||
14 | - | |||||||
15 | - | |||||||
16 | - | |||||||
17 | QTcpServerPrivate::~QTcpServerPrivate() | - | ||||||
18 | { | - | ||||||
19 | } | - | ||||||
20 | - | |||||||
21 | - | |||||||
22 | - | |||||||
23 | - | |||||||
24 | - | |||||||
25 | - | |||||||
26 | QNetworkProxy QTcpServerPrivate::resolveProxy(const QHostAddress &address, quint16 port) | - | ||||||
27 | { | - | ||||||
28 | if (address.isLoopback()
| 75-688 | ||||||
29 | return executed 75 times by 11 tests: QNetworkProxy::NoProxy;return QNetworkProxy::NoProxy; Executed by:
executed 75 times by 11 tests: return QNetworkProxy::NoProxy; Executed by:
| 75 | ||||||
30 | - | |||||||
31 | QList<QNetworkProxy> proxies; | - | ||||||
32 | if (proxy.type() != QNetworkProxy::DefaultProxy
| 10-678 | ||||||
33 | - | |||||||
34 | proxies << proxy; | - | ||||||
35 | } executed 10 times by 2 tests: else {end of block Executed by:
| 10 | ||||||
36 | - | |||||||
37 | QNetworkProxyQuery query(port, QString(), QNetworkProxyQuery::TcpServer); | - | ||||||
38 | proxies = QNetworkProxyFactory::proxyForQuery(query); | - | ||||||
39 | } executed 678 times by 11 tests: end of block Executed by:
| 678 | ||||||
40 | - | |||||||
41 | - | |||||||
42 | for (QForeachContainer<typename QtPrivate::remove_reference<decltype(proxies)>::type> _container_((proxies)); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1) for (const QNetworkProxy &p = *_container_.i; _container_.control; _container_.control = 0): qAsConst(proxies)) { | - | ||||||
43 | if (p.capabilities() & QNetworkProxy::ListeningCapability
| 10-682 | ||||||
44 | return executed 682 times by 11 tests: p;return p; Executed by:
executed 682 times by 11 tests: return p; Executed by:
| 682 | ||||||
45 | } executed 10 times by 1 test: end of block Executed by:
| 10 | ||||||
46 | - | |||||||
47 | - | |||||||
48 | - | |||||||
49 | return executed 6 times by 1 test: QNetworkProxy(QNetworkProxy::DefaultProxy);return QNetworkProxy(QNetworkProxy::DefaultProxy); Executed by:
executed 6 times by 1 test: return QNetworkProxy(QNetworkProxy::DefaultProxy); Executed by:
| 6 | ||||||
50 | } | - | ||||||
51 | - | |||||||
52 | - | |||||||
53 | - | |||||||
54 | - | |||||||
55 | void QTcpServerPrivate::configureCreatedSocket() | - | ||||||
56 | { | - | ||||||
57 | socketEngine->setOption(QAbstractSocketEngine::AddressReusable, 1); | - | ||||||
58 | - | |||||||
59 | } | - | ||||||
60 | - | |||||||
61 | - | |||||||
62 | - | |||||||
63 | void QTcpServerPrivate::readNotification() | - | ||||||
64 | { | - | ||||||
65 | QTcpServer * const q = q_func(); | - | ||||||
66 | for (;;) { | - | ||||||
67 | if (pendingConnections.count() >= maxConnections) { | - | ||||||
68 | - | |||||||
69 | - | |||||||
70 | - | |||||||
71 | if (socketEngine->isReadNotificationEnabled()) | - | ||||||
72 | socketEngine->setReadNotificationEnabled(false); | - | ||||||
73 | return; | - | ||||||
74 | } | - | ||||||
75 | - | |||||||
76 | int descriptor = socketEngine->accept(); | - | ||||||
77 | if (descriptor == -1) { | - | ||||||
78 | if (socketEngine->error() != QAbstractSocket::TemporaryError) { | - | ||||||
79 | q->pauseAccepting(); | - | ||||||
80 | serverSocketError = socketEngine->error(); | - | ||||||
81 | serverSocketErrorString = socketEngine->errorString(); | - | ||||||
82 | q->acceptError(serverSocketError); | - | ||||||
83 | } | - | ||||||
84 | break; | - | ||||||
85 | } | - | ||||||
86 | - | |||||||
87 | - | |||||||
88 | - | |||||||
89 | q->incomingConnection(descriptor); | - | ||||||
90 | - | |||||||
91 | QPointer<QTcpServer> that = q; | - | ||||||
92 | q->newConnection(); | - | ||||||
93 | if (!that || !q->isListening()) | - | ||||||
94 | return; | - | ||||||
95 | } | - | ||||||
96 | } | - | ||||||
97 | QTcpServer::QTcpServer(QObject *parent) | - | ||||||
98 | : QObject(*new QTcpServerPrivate, parent) | - | ||||||
99 | { | - | ||||||
100 | - | |||||||
101 | - | |||||||
102 | - | |||||||
103 | } | - | ||||||
104 | QTcpServer::~QTcpServer() | - | ||||||
105 | { | - | ||||||
106 | - | |||||||
107 | - | |||||||
108 | - | |||||||
109 | close(); | - | ||||||
110 | } | - | ||||||
111 | - | |||||||
112 | - | |||||||
113 | - | |||||||
114 | QTcpServer::QTcpServer(QTcpServerPrivate &dd, QObject *parent) | - | ||||||
115 | : QObject(dd, parent) | - | ||||||
116 | { | - | ||||||
117 | - | |||||||
118 | - | |||||||
119 | - | |||||||
120 | } | - | ||||||
121 | bool QTcpServer::listen(const QHostAddress &address, quint16 port) | - | ||||||
122 | { | - | ||||||
123 | QTcpServerPrivate * const d = d_func(); | - | ||||||
124 | if (d->state == QAbstractSocket::ListeningState) { | - | ||||||
125 | QMessageLogger(__FILE__, 271277, __PRETTY_FUNCTION__).warning("QTcpServer::listen() called when already listening"); | - | ||||||
126 | return false; | - | ||||||
127 | } | - | ||||||
128 | - | |||||||
129 | QAbstractSocket::NetworkLayerProtocol proto = address.protocol(); | - | ||||||
130 | QHostAddress addr = address; | - | ||||||
131 | - | |||||||
132 | - | |||||||
133 | - | |||||||
134 | - | |||||||
135 | QNetworkProxy proxy = d->resolveProxy(addr, port); | - | ||||||
136 | - | |||||||
137 | - | |||||||
138 | delete d->socketEngine; | - | ||||||
139 | d->socketEngine = QAbstractSocketEngine::createSocketEngine(QAbstractSocket::TcpSocket, proxy, this); | - | ||||||
140 | if (!d->socketEngine) { | - | ||||||
141 | d->serverSocketError = QAbstractSocket::UnsupportedSocketOperationError; | - | ||||||
142 | d->serverSocketErrorString = tr("Operation on socket is not supported"); | - | ||||||
143 | return false; | - | ||||||
144 | } | - | ||||||
145 | - | |||||||
146 | - | |||||||
147 | d->socketEngine->setProperty("_q_networksession", property("_q_networksession")); | - | ||||||
148 | - | |||||||
149 | if (!d->socketEngine->initialize(QAbstractSocket::TcpSocket, proto)) { | - | ||||||
150 | d->serverSocketError = d->socketEngine->error(); | - | ||||||
151 | d->serverSocketErrorString = d->socketEngine->errorString(); | - | ||||||
152 | return false; | - | ||||||
153 | } | - | ||||||
154 | proto = d->socketEngine->protocol(); | - | ||||||
155 | if (addr.protocol() == QAbstractSocket::AnyIPProtocol && proto == QAbstractSocket::IPv4Protocol) | - | ||||||
156 | addr = QHostAddress::AnyIPv4; | - | ||||||
157 | - | |||||||
158 | d->configureCreatedSocket(); | - | ||||||
159 | - | |||||||
160 | if (!d->socketEngine->bind(addr, port)) { | - | ||||||
161 | d->serverSocketError = d->socketEngine->error(); | - | ||||||
162 | d->serverSocketErrorString = d->socketEngine->errorString(); | - | ||||||
163 | return false; | - | ||||||
164 | } | - | ||||||
165 | - | |||||||
166 | if (!d->socketEngine->listen()) { | - | ||||||
167 | d->serverSocketError = d->socketEngine->error(); | - | ||||||
168 | d->serverSocketErrorString = d->socketEngine->errorString(); | - | ||||||
169 | return false; | - | ||||||
170 | } | - | ||||||
171 | - | |||||||
172 | d->socketEngine->setReceiver(d); | - | ||||||
173 | d->socketEngine->setReadNotificationEnabled(true); | - | ||||||
174 | - | |||||||
175 | d->state = QAbstractSocket::ListeningState; | - | ||||||
176 | d->address = d->socketEngine->localAddress(); | - | ||||||
177 | d->port = d->socketEngine->localPort(); | - | ||||||
178 | - | |||||||
179 | - | |||||||
180 | - | |||||||
181 | - | |||||||
182 | - | |||||||
183 | return true; | - | ||||||
184 | } | - | ||||||
185 | - | |||||||
186 | - | |||||||
187 | - | |||||||
188 | - | |||||||
189 | - | |||||||
190 | - | |||||||
191 | - | |||||||
192 | bool QTcpServer::isListening() const | - | ||||||
193 | { | - | ||||||
194 | const QTcpServerPrivate * const d = d_func(); | - | ||||||
195 | do { if (!d->socketEngine) { return false; } } while (0); | - | ||||||
196 | return d->socketEngine->state() == QAbstractSocket::ListeningState; | - | ||||||
197 | } | - | ||||||
198 | - | |||||||
199 | - | |||||||
200 | - | |||||||
201 | - | |||||||
202 | - | |||||||
203 | - | |||||||
204 | - | |||||||
205 | void QTcpServer::close() | - | ||||||
206 | { | - | ||||||
207 | QTcpServerPrivate * const d = d_func(); | - | ||||||
208 | - | |||||||
209 | qDeleteAll(d->pendingConnections); | - | ||||||
210 | d->pendingConnections.clear(); | - | ||||||
211 | - | |||||||
212 | if (d->socketEngine) { | - | ||||||
213 | d->socketEngine->close(); | - | ||||||
214 | if (true) { | - | ||||||
215 | d->socketEngine->deleteLater(); | - | ||||||
216 | } else { dead code: { } | - | ||||||
217 | - | |||||||
218 | - | |||||||
219 | } dead code: { } | - | ||||||
220 | d->socketEngine = 0; | - | ||||||
221 | } | - | ||||||
222 | - | |||||||
223 | d->state = QAbstractSocket::UnconnectedState; | - | ||||||
224 | } | - | ||||||
225 | qintptr QTcpServer::socketDescriptor() const | - | ||||||
226 | { | - | ||||||
227 | const QTcpServerPrivate * const d = d_func(); | - | ||||||
228 | do { if (!d->socketEngine) { return -1; } } while (0); | - | ||||||
229 | return d->socketEngine->socketDescriptor(); | - | ||||||
230 | } | - | ||||||
231 | bool QTcpServer::setSocketDescriptor(qintptr socketDescriptor) | - | ||||||
232 | { | - | ||||||
233 | QTcpServerPrivate * const d = d_func(); | - | ||||||
234 | if (isListening()) { | - | ||||||
235 | QMessageLogger(__FILE__, 401407, __PRETTY_FUNCTION__).warning("QTcpServer::setSocketDescriptor() called when already listening"); | - | ||||||
236 | return false; | - | ||||||
237 | } | - | ||||||
238 | - | |||||||
239 | if (d->socketEngine) | - | ||||||
240 | delete d->socketEngine; | - | ||||||
241 | d->socketEngine = QAbstractSocketEngine::createSocketEngine(socketDescriptor, this); | - | ||||||
242 | if (!d->socketEngine) { | - | ||||||
243 | d->serverSocketError = QAbstractSocket::UnsupportedSocketOperationError; | - | ||||||
244 | d->serverSocketErrorString = tr("Operation on socket is not supported"); | - | ||||||
245 | return false; | - | ||||||
246 | } | - | ||||||
247 | - | |||||||
248 | - | |||||||
249 | d->socketEngine->setProperty("_q_networksession", property("_q_networksession")); | - | ||||||
250 | - | |||||||
251 | if (!d->socketEngine->initialize(socketDescriptor, QAbstractSocket::ListeningState)) { | - | ||||||
252 | d->serverSocketError = d->socketEngine->error(); | - | ||||||
253 | d->serverSocketErrorString = d->socketEngine->errorString(); | - | ||||||
254 | - | |||||||
255 | - | |||||||
256 | - | |||||||
257 | - | |||||||
258 | return false; | - | ||||||
259 | } | - | ||||||
260 | - | |||||||
261 | d->socketEngine->setReceiver(d); | - | ||||||
262 | d->socketEngine->setReadNotificationEnabled(true); | - | ||||||
263 | - | |||||||
264 | d->state = d->socketEngine->state(); | - | ||||||
265 | d->address = d->socketEngine->localAddress(); | - | ||||||
266 | d->port = d->socketEngine->localPort(); | - | ||||||
267 | - | |||||||
268 | - | |||||||
269 | - | |||||||
270 | - | |||||||
271 | return true; | - | ||||||
272 | } | - | ||||||
273 | - | |||||||
274 | - | |||||||
275 | - | |||||||
276 | - | |||||||
277 | - | |||||||
278 | - | |||||||
279 | - | |||||||
280 | quint16 QTcpServer::serverPort() const | - | ||||||
281 | { | - | ||||||
282 | const QTcpServerPrivate * const d = d_func(); | - | ||||||
283 | do { if (!d->socketEngine) { return 0; } } while (0); | - | ||||||
284 | return d->socketEngine->localPort(); | - | ||||||
285 | } | - | ||||||
286 | - | |||||||
287 | - | |||||||
288 | - | |||||||
289 | - | |||||||
290 | - | |||||||
291 | - | |||||||
292 | - | |||||||
293 | QHostAddress QTcpServer::serverAddress() const | - | ||||||
294 | { | - | ||||||
295 | const QTcpServerPrivate * const d = d_func(); | - | ||||||
296 | do { if (!d->socketEngine) { return QHostAddress(QHostAddress::Null); } } while (0); | - | ||||||
297 | return d->socketEngine->localAddress(); | - | ||||||
298 | } | - | ||||||
299 | bool QTcpServer::waitForNewConnection(int msec, bool *timedOut) | - | ||||||
300 | { | - | ||||||
301 | QTcpServerPrivate * const d = d_func(); | - | ||||||
302 | if (d->state != QAbstractSocket::ListeningState) | - | ||||||
303 | return false; | - | ||||||
304 | - | |||||||
305 | if (!d->socketEngine->waitForRead(msec, timedOut)) { | - | ||||||
306 | d->serverSocketError = d->socketEngine->error(); | - | ||||||
307 | d->serverSocketErrorString = d->socketEngine->errorString(); | - | ||||||
308 | return false; | - | ||||||
309 | } | - | ||||||
310 | - | |||||||
311 | if (timedOut && *timedOut) | - | ||||||
312 | return false; | - | ||||||
313 | - | |||||||
314 | d->readNotification(); | - | ||||||
315 | - | |||||||
316 | return true; | - | ||||||
317 | } | - | ||||||
318 | - | |||||||
319 | - | |||||||
320 | - | |||||||
321 | - | |||||||
322 | - | |||||||
323 | - | |||||||
324 | - | |||||||
325 | bool QTcpServer::hasPendingConnections() const | - | ||||||
326 | { | - | ||||||
327 | return !d_func()->pendingConnections.isEmpty(); | - | ||||||
328 | } | - | ||||||
329 | QTcpSocket *QTcpServer::nextPendingConnection() | - | ||||||
330 | { | - | ||||||
331 | QTcpServerPrivate * const d = d_func(); | - | ||||||
332 | if (d->pendingConnections.isEmpty()) | - | ||||||
333 | return 0; | - | ||||||
334 | - | |||||||
335 | if (!d->socketEngine->isReadNotificationEnabled()) | - | ||||||
336 | d->socketEngine->setReadNotificationEnabled(true); | - | ||||||
337 | - | |||||||
338 | return d->pendingConnections.takeFirst(); | - | ||||||
339 | } | - | ||||||
340 | void QTcpServer::incomingConnection(qintptr socketDescriptor) | - | ||||||
341 | { | - | ||||||
342 | - | |||||||
343 | - | |||||||
344 | - | |||||||
345 | - | |||||||
346 | QTcpSocket *socket = new QTcpSocket(this); | - | ||||||
347 | socket->setSocketDescriptor(socketDescriptor); | - | ||||||
348 | addPendingConnection(socket); | - | ||||||
349 | } | - | ||||||
350 | void QTcpServer::addPendingConnection(QTcpSocket* socket) | - | ||||||
351 | { | - | ||||||
352 | d_func()->pendingConnections.append(socket); | - | ||||||
353 | } | - | ||||||
354 | void QTcpServer::setMaxPendingConnections(int numConnections) | - | ||||||
355 | { | - | ||||||
356 | d_func()->maxConnections = numConnections; | - | ||||||
357 | } | - | ||||||
358 | - | |||||||
359 | - | |||||||
360 | - | |||||||
361 | - | |||||||
362 | - | |||||||
363 | - | |||||||
364 | - | |||||||
365 | int QTcpServer::maxPendingConnections() const | - | ||||||
366 | { | - | ||||||
367 | return d_func()->maxConnections; | - | ||||||
368 | } | - | ||||||
369 | - | |||||||
370 | - | |||||||
371 | - | |||||||
372 | - | |||||||
373 | - | |||||||
374 | - | |||||||
375 | QAbstractSocket::SocketError QTcpServer::serverError() const | - | ||||||
376 | { | - | ||||||
377 | return d_func()->serverSocketError; | - | ||||||
378 | } | - | ||||||
379 | - | |||||||
380 | - | |||||||
381 | - | |||||||
382 | - | |||||||
383 | - | |||||||
384 | - | |||||||
385 | - | |||||||
386 | QString QTcpServer::errorString() const | - | ||||||
387 | { | - | ||||||
388 | return d_func()->serverSocketErrorString; | - | ||||||
389 | } | - | ||||||
390 | void QTcpServer::pauseAccepting() | - | ||||||
391 | { | - | ||||||
392 | d_func()->socketEngine->setReadNotificationEnabled(false); | - | ||||||
393 | } | - | ||||||
394 | void QTcpServer::resumeAccepting() | - | ||||||
395 | { | - | ||||||
396 | d_func()->socketEngine->setReadNotificationEnabled(true); | - | ||||||
397 | } | - | ||||||
398 | void QTcpServer::setProxy(const QNetworkProxy &networkProxy) | - | ||||||
399 | { | - | ||||||
400 | QTcpServerPrivate * const d = d_func(); | - | ||||||
401 | d->proxy = networkProxy; | - | ||||||
402 | } | - | ||||||
403 | QNetworkProxy QTcpServer::proxy() const | - | ||||||
404 | { | - | ||||||
405 | const QTcpServerPrivate * const d = d_func(); | - | ||||||
406 | return d->proxy; | - | ||||||
407 | } | - | ||||||
408 | - | |||||||
409 | - | |||||||
410 | - | |||||||
411 | - | |||||||
Switch to Source code | Preprocessed file |