blob: bb79d167911198dc556139d9460bd731b37cc778 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
Donald E Curtisa8736442015-08-05 15:48:13 -07002 * Copyright 2012 The WebRTC Project Authors. All rights reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
Donald E Curtisa8736442015-08-05 15:48:13 -07004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "examples/peerconnection/client/peer_connection_client.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000012
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "examples/peerconnection/client/defaults.h"
14#include "rtc_base/checks.h"
15#include "rtc_base/logging.h"
16#include "rtc_base/nethelpers.h"
17#include "rtc_base/stringutils.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000018
19#ifdef WIN32
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "rtc_base/win32socketserver.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000021#endif
22
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000023using rtc::sprintfn;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000024
25namespace {
26
27// This is our magical hangup signal.
28const char kByeMessage[] = "BYE";
29// Delay between server connection retries, in milliseconds
30const int kReconnectDelay = 2000;
31
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000032rtc::AsyncSocket* CreateClientSocket(int family) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000033#ifdef WIN32
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000034 rtc::Win32Socket* sock = new rtc::Win32Socket();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035 sock->CreateT(family, SOCK_STREAM);
36 return sock;
Thiago Farina91543732015-04-20 13:14:36 +020037#elif defined(WEBRTC_POSIX)
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000038 rtc::Thread* thread = rtc::Thread::Current();
nisseede5da42017-01-12 05:15:36 -080039 RTC_DCHECK(thread != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000040 return thread->socketserver()->CreateAsyncSocket(family, SOCK_STREAM);
41#else
42#error Platform not supported.
43#endif
44}
45
jbauch70625e52015-12-09 14:18:14 -080046} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000047
48PeerConnectionClient::PeerConnectionClient()
Yves Gerey665174f2018-06-19 15:03:05 +020049 : callback_(NULL), resolver_(NULL), state_(NOT_CONNECTED), my_id_(-1) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050
Yves Gerey665174f2018-06-19 15:03:05 +020051PeerConnectionClient::~PeerConnectionClient() {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052
53void PeerConnectionClient::InitSocketSignals() {
nisseede5da42017-01-12 05:15:36 -080054 RTC_DCHECK(control_socket_.get() != NULL);
55 RTC_DCHECK(hanging_get_.get() != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000056 control_socket_->SignalCloseEvent.connect(this,
Yves Gerey665174f2018-06-19 15:03:05 +020057 &PeerConnectionClient::OnClose);
58 hanging_get_->SignalCloseEvent.connect(this, &PeerConnectionClient::OnClose);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059 control_socket_->SignalConnectEvent.connect(this,
Yves Gerey665174f2018-06-19 15:03:05 +020060 &PeerConnectionClient::OnConnect);
61 hanging_get_->SignalConnectEvent.connect(
62 this, &PeerConnectionClient::OnHangingGetConnect);
63 control_socket_->SignalReadEvent.connect(this, &PeerConnectionClient::OnRead);
64 hanging_get_->SignalReadEvent.connect(
65 this, &PeerConnectionClient::OnHangingGetRead);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066}
67
68int PeerConnectionClient::id() const {
69 return my_id_;
70}
71
72bool PeerConnectionClient::is_connected() const {
73 return my_id_ != -1;
74}
75
76const Peers& PeerConnectionClient::peers() const {
77 return peers_;
78}
79
80void PeerConnectionClient::RegisterObserver(
81 PeerConnectionClientObserver* callback) {
nisseede5da42017-01-12 05:15:36 -080082 RTC_DCHECK(!callback_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083 callback_ = callback;
84}
85
Yves Gerey665174f2018-06-19 15:03:05 +020086void PeerConnectionClient::Connect(const std::string& server,
87 int port,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088 const std::string& client_name) {
nisseede5da42017-01-12 05:15:36 -080089 RTC_DCHECK(!server.empty());
90 RTC_DCHECK(!client_name.empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +000091
92 if (state_ != NOT_CONNECTED) {
Mirko Bonadei675513b2017-11-09 11:09:25 +010093 RTC_LOG(WARNING)
henrike@webrtc.org28e20752013-07-10 00:45:36 +000094 << "The client must not be connected before you can call Connect()";
95 callback_->OnServerConnectionFailure();
96 return;
97 }
98
99 if (server.empty() || client_name.empty()) {
100 callback_->OnServerConnectionFailure();
101 return;
102 }
103
104 if (port <= 0)
105 port = kDefaultServerPort;
106
107 server_address_.SetIP(server);
108 server_address_.SetPort(port);
109 client_name_ = client_name;
110
tfarina20a34612015-11-02 16:20:22 -0800111 if (server_address_.IsUnresolvedIP()) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000112 state_ = RESOLVING;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000113 resolver_ = new rtc::AsyncResolver();
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000114 resolver_->SignalDone.connect(this, &PeerConnectionClient::OnResolveResult);
115 resolver_->Start(server_address_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000116 } else {
117 DoConnect();
118 }
119}
120
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000121void PeerConnectionClient::OnResolveResult(
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000122 rtc::AsyncResolverInterface* resolver) {
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000123 if (resolver_->GetError() != 0) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000124 callback_->OnServerConnectionFailure();
125 resolver_->Destroy(false);
126 resolver_ = NULL;
127 state_ = NOT_CONNECTED;
128 } else {
129 server_address_ = resolver_->address();
130 DoConnect();
131 }
132}
133
134void PeerConnectionClient::DoConnect() {
135 control_socket_.reset(CreateClientSocket(server_address_.ipaddr().family()));
136 hanging_get_.reset(CreateClientSocket(server_address_.ipaddr().family()));
137 InitSocketSignals();
138 char buffer[1024];
Yves Gerey665174f2018-06-19 15:03:05 +0200139 sprintfn(buffer, sizeof(buffer), "GET /sign_in?%s HTTP/1.0\r\n\r\n",
140 client_name_.c_str());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000141 onconnect_data_ = buffer;
142
143 bool ret = ConnectControlSocket();
144 if (ret)
145 state_ = SIGNING_IN;
146 if (!ret) {
147 callback_->OnServerConnectionFailure();
148 }
149}
150
151bool PeerConnectionClient::SendToPeer(int peer_id, const std::string& message) {
152 if (state_ != CONNECTED)
153 return false;
154
nisseede5da42017-01-12 05:15:36 -0800155 RTC_DCHECK(is_connected());
156 RTC_DCHECK(control_socket_->GetState() == rtc::Socket::CS_CLOSED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000157 if (!is_connected() || peer_id == -1)
158 return false;
159
160 char headers[1024];
161 sprintfn(headers, sizeof(headers),
Yves Gerey665174f2018-06-19 15:03:05 +0200162 "POST /message?peer_id=%i&to=%i HTTP/1.0\r\n"
163 "Content-Length: %i\r\n"
164 "Content-Type: text/plain\r\n"
165 "\r\n",
166 my_id_, peer_id, message.length());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000167 onconnect_data_ = headers;
168 onconnect_data_ += message;
169 return ConnectControlSocket();
170}
171
172bool PeerConnectionClient::SendHangUp(int peer_id) {
173 return SendToPeer(peer_id, kByeMessage);
174}
175
176bool PeerConnectionClient::IsSendingMessage() {
177 return state_ == CONNECTED &&
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000178 control_socket_->GetState() != rtc::Socket::CS_CLOSED;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000179}
180
181bool PeerConnectionClient::SignOut() {
182 if (state_ == NOT_CONNECTED || state_ == SIGNING_OUT)
183 return true;
184
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000185 if (hanging_get_->GetState() != rtc::Socket::CS_CLOSED)
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000186 hanging_get_->Close();
187
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000188 if (control_socket_->GetState() == rtc::Socket::CS_CLOSED) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000189 state_ = SIGNING_OUT;
190
191 if (my_id_ != -1) {
192 char buffer[1024];
193 sprintfn(buffer, sizeof(buffer),
Yves Gerey665174f2018-06-19 15:03:05 +0200194 "GET /sign_out?peer_id=%i HTTP/1.0\r\n\r\n", my_id_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000195 onconnect_data_ = buffer;
196 return ConnectControlSocket();
197 } else {
198 // Can occur if the app is closed before we finish connecting.
199 return true;
200 }
201 } else {
202 state_ = SIGNING_OUT_WAITING;
203 }
204
205 return true;
206}
207
208void PeerConnectionClient::Close() {
209 control_socket_->Close();
210 hanging_get_->Close();
211 onconnect_data_.clear();
212 peers_.clear();
213 if (resolver_ != NULL) {
214 resolver_->Destroy(false);
215 resolver_ = NULL;
216 }
217 my_id_ = -1;
218 state_ = NOT_CONNECTED;
219}
220
221bool PeerConnectionClient::ConnectControlSocket() {
nisseede5da42017-01-12 05:15:36 -0800222 RTC_DCHECK(control_socket_->GetState() == rtc::Socket::CS_CLOSED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000223 int err = control_socket_->Connect(server_address_);
224 if (err == SOCKET_ERROR) {
225 Close();
226 return false;
227 }
228 return true;
229}
230
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000231void PeerConnectionClient::OnConnect(rtc::AsyncSocket* socket) {
nisseede5da42017-01-12 05:15:36 -0800232 RTC_DCHECK(!onconnect_data_.empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000233 size_t sent = socket->Send(onconnect_data_.c_str(), onconnect_data_.length());
nisseede5da42017-01-12 05:15:36 -0800234 RTC_DCHECK(sent == onconnect_data_.length());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000235 onconnect_data_.clear();
236}
237
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000238void PeerConnectionClient::OnHangingGetConnect(rtc::AsyncSocket* socket) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000239 char buffer[1024];
Yves Gerey665174f2018-06-19 15:03:05 +0200240 sprintfn(buffer, sizeof(buffer), "GET /wait?peer_id=%i HTTP/1.0\r\n\r\n",
241 my_id_);
henrike@webrtc.org28654cb2013-07-22 21:07:49 +0000242 int len = static_cast<int>(strlen(buffer));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000243 int sent = socket->Send(buffer, len);
nisseede5da42017-01-12 05:15:36 -0800244 RTC_DCHECK(sent == len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000245}
246
247void PeerConnectionClient::OnMessageFromPeer(int peer_id,
248 const std::string& message) {
249 if (message.length() == (sizeof(kByeMessage) - 1) &&
250 message.compare(kByeMessage) == 0) {
251 callback_->OnPeerDisconnected(peer_id);
252 } else {
253 callback_->OnMessageFromPeer(peer_id, message);
254 }
255}
256
257bool PeerConnectionClient::GetHeaderValue(const std::string& data,
258 size_t eoh,
259 const char* header_pattern,
260 size_t* value) {
nisseede5da42017-01-12 05:15:36 -0800261 RTC_DCHECK(value != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000262 size_t found = data.find(header_pattern);
263 if (found != std::string::npos && found < eoh) {
264 *value = atoi(&data[found + strlen(header_pattern)]);
265 return true;
266 }
267 return false;
268}
269
Yves Gerey665174f2018-06-19 15:03:05 +0200270bool PeerConnectionClient::GetHeaderValue(const std::string& data,
271 size_t eoh,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000272 const char* header_pattern,
273 std::string* value) {
nisseede5da42017-01-12 05:15:36 -0800274 RTC_DCHECK(value != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000275 size_t found = data.find(header_pattern);
276 if (found != std::string::npos && found < eoh) {
277 size_t begin = found + strlen(header_pattern);
278 size_t end = data.find("\r\n", begin);
279 if (end == std::string::npos)
280 end = eoh;
281 value->assign(data.substr(begin, end - begin));
282 return true;
283 }
284 return false;
285}
286
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000287bool PeerConnectionClient::ReadIntoBuffer(rtc::AsyncSocket* socket,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000288 std::string* data,
289 size_t* content_length) {
290 char buffer[0xffff];
291 do {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200292 int bytes = socket->Recv(buffer, sizeof(buffer), nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000293 if (bytes <= 0)
294 break;
295 data->append(buffer, bytes);
296 } while (true);
297
298 bool ret = false;
299 size_t i = data->find("\r\n\r\n");
300 if (i != std::string::npos) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100301 RTC_LOG(INFO) << "Headers received";
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000302 if (GetHeaderValue(*data, i, "\r\nContent-Length: ", content_length)) {
303 size_t total_response_size = (i + 4) + *content_length;
304 if (data->length() >= total_response_size) {
305 ret = true;
306 std::string should_close;
307 const char kConnection[] = "\r\nConnection: ";
308 if (GetHeaderValue(*data, i, kConnection, &should_close) &&
309 should_close.compare("close") == 0) {
310 socket->Close();
311 // Since we closed the socket, there was no notification delivered
312 // to us. Compensate by letting ourselves know.
313 OnClose(socket, 0);
314 }
315 } else {
316 // We haven't received everything. Just continue to accept data.
317 }
318 } else {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100319 RTC_LOG(LS_ERROR) << "No content length field specified by the server.";
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000320 }
321 }
322 return ret;
323}
324
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000325void PeerConnectionClient::OnRead(rtc::AsyncSocket* socket) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000326 size_t content_length = 0;
327 if (ReadIntoBuffer(socket, &control_data_, &content_length)) {
328 size_t peer_id = 0, eoh = 0;
Yves Gerey665174f2018-06-19 15:03:05 +0200329 bool ok =
330 ParseServerResponse(control_data_, content_length, &peer_id, &eoh);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000331 if (ok) {
332 if (my_id_ == -1) {
333 // First response. Let's store our server assigned ID.
nisseede5da42017-01-12 05:15:36 -0800334 RTC_DCHECK(state_ == SIGNING_IN);
henrike@webrtc.org28654cb2013-07-22 21:07:49 +0000335 my_id_ = static_cast<int>(peer_id);
nisseede5da42017-01-12 05:15:36 -0800336 RTC_DCHECK(my_id_ != -1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000337
338 // The body of the response will be a list of already connected peers.
339 if (content_length) {
340 size_t pos = eoh + 4;
341 while (pos < control_data_.size()) {
342 size_t eol = control_data_.find('\n', pos);
343 if (eol == std::string::npos)
344 break;
345 int id = 0;
346 std::string name;
347 bool connected;
348 if (ParseEntry(control_data_.substr(pos, eol - pos), &name, &id,
Yves Gerey665174f2018-06-19 15:03:05 +0200349 &connected) &&
350 id != my_id_) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000351 peers_[id] = name;
352 callback_->OnPeerConnected(id, name);
353 }
354 pos = eol + 1;
355 }
356 }
nisseede5da42017-01-12 05:15:36 -0800357 RTC_DCHECK(is_connected());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000358 callback_->OnSignedIn();
359 } else if (state_ == SIGNING_OUT) {
360 Close();
361 callback_->OnDisconnected();
362 } else if (state_ == SIGNING_OUT_WAITING) {
363 SignOut();
364 }
365 }
366
367 control_data_.clear();
368
369 if (state_ == SIGNING_IN) {
nisseede5da42017-01-12 05:15:36 -0800370 RTC_DCHECK(hanging_get_->GetState() == rtc::Socket::CS_CLOSED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000371 state_ = CONNECTED;
372 hanging_get_->Connect(server_address_);
373 }
374 }
375}
376
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000377void PeerConnectionClient::OnHangingGetRead(rtc::AsyncSocket* socket) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100378 RTC_LOG(INFO) << __FUNCTION__;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000379 size_t content_length = 0;
380 if (ReadIntoBuffer(socket, &notification_data_, &content_length)) {
381 size_t peer_id = 0, eoh = 0;
Yves Gerey665174f2018-06-19 15:03:05 +0200382 bool ok =
383 ParseServerResponse(notification_data_, content_length, &peer_id, &eoh);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000384
385 if (ok) {
386 // Store the position where the body begins.
387 size_t pos = eoh + 4;
388
389 if (my_id_ == static_cast<int>(peer_id)) {
390 // A notification about a new member or a member that just
391 // disconnected.
392 int id = 0;
393 std::string name;
394 bool connected = false;
395 if (ParseEntry(notification_data_.substr(pos), &name, &id,
396 &connected)) {
397 if (connected) {
398 peers_[id] = name;
399 callback_->OnPeerConnected(id, name);
400 } else {
401 peers_.erase(id);
402 callback_->OnPeerDisconnected(id);
403 }
404 }
405 } else {
henrike@webrtc.org28654cb2013-07-22 21:07:49 +0000406 OnMessageFromPeer(static_cast<int>(peer_id),
407 notification_data_.substr(pos));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000408 }
409 }
410
411 notification_data_.clear();
412 }
413
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000414 if (hanging_get_->GetState() == rtc::Socket::CS_CLOSED &&
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000415 state_ == CONNECTED) {
416 hanging_get_->Connect(server_address_);
417 }
418}
419
420bool PeerConnectionClient::ParseEntry(const std::string& entry,
421 std::string* name,
422 int* id,
423 bool* connected) {
nisseede5da42017-01-12 05:15:36 -0800424 RTC_DCHECK(name != NULL);
425 RTC_DCHECK(id != NULL);
426 RTC_DCHECK(connected != NULL);
427 RTC_DCHECK(!entry.empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000428
429 *connected = false;
430 size_t separator = entry.find(',');
431 if (separator != std::string::npos) {
432 *id = atoi(&entry[separator + 1]);
433 name->assign(entry.substr(0, separator));
434 separator = entry.find(',', separator + 1);
435 if (separator != std::string::npos) {
436 *connected = atoi(&entry[separator + 1]) ? true : false;
437 }
438 }
439 return !name->empty();
440}
441
442int PeerConnectionClient::GetResponseStatus(const std::string& response) {
443 int status = -1;
444 size_t pos = response.find(' ');
445 if (pos != std::string::npos)
446 status = atoi(&response[pos + 1]);
447 return status;
448}
449
450bool PeerConnectionClient::ParseServerResponse(const std::string& response,
451 size_t content_length,
452 size_t* peer_id,
453 size_t* eoh) {
454 int status = GetResponseStatus(response.c_str());
455 if (status != 200) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100456 RTC_LOG(LS_ERROR) << "Received error from server";
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000457 Close();
458 callback_->OnDisconnected();
459 return false;
460 }
461
462 *eoh = response.find("\r\n\r\n");
nisseede5da42017-01-12 05:15:36 -0800463 RTC_DCHECK(*eoh != std::string::npos);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000464 if (*eoh == std::string::npos)
465 return false;
466
467 *peer_id = -1;
468
469 // See comment in peer_channel.cc for why we use the Pragma header and
470 // not e.g. "X-Peer-Id".
471 GetHeaderValue(response, *eoh, "\r\nPragma: ", peer_id);
472
473 return true;
474}
475
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000476void PeerConnectionClient::OnClose(rtc::AsyncSocket* socket, int err) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100477 RTC_LOG(INFO) << __FUNCTION__;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000478
479 socket->Close();
480
481#ifdef WIN32
482 if (err != WSAECONNREFUSED) {
483#else
484 if (err != ECONNREFUSED) {
485#endif
486 if (socket == hanging_get_.get()) {
487 if (state_ == CONNECTED) {
488 hanging_get_->Close();
489 hanging_get_->Connect(server_address_);
490 }
491 } else {
492 callback_->OnMessageSent(err);
493 }
494 } else {
495 if (socket == control_socket_.get()) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100496 RTC_LOG(WARNING) << "Connection refused; retrying in 2 seconds";
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700497 rtc::Thread::Current()->PostDelayed(RTC_FROM_HERE, kReconnectDelay, this,
498 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000499 } else {
500 Close();
501 callback_->OnDisconnected();
502 }
503 }
504}
505
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000506void PeerConnectionClient::OnMessage(rtc::Message* msg) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000507 // ignore msg; there is currently only one supported message ("retry")
508 DoConnect();
509}