blob: c0de4ffb5df9f7a3f9ce78b1254057835133d181 [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"
Steve Anton10542f22019-01-11 09:11:00 -080016#include "rtc_base/net_helpers.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000017
henrike@webrtc.org28e20752013-07-10 00:45:36 +000018namespace {
19
20// This is our magical hangup signal.
21const char kByeMessage[] = "BYE";
22// Delay between server connection retries, in milliseconds
23const int kReconnectDelay = 2000;
24
Niels Möllerd0b88792021-08-12 10:32:30 +020025rtc::Socket* CreateClientSocket(int family) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000026 rtc::Thread* thread = rtc::Thread::Current();
nisseede5da42017-01-12 05:15:36 -080027 RTC_DCHECK(thread != NULL);
Niels Möllerd0b88792021-08-12 10:32:30 +020028 return thread->socketserver()->CreateSocket(family, SOCK_STREAM);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000029}
30
jbauch70625e52015-12-09 14:18:14 -080031} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032
33PeerConnectionClient::PeerConnectionClient()
Tomas Gunnarsson77baeee2020-09-24 22:39:21 +020034 : callback_(NULL), resolver_(NULL), state_(NOT_CONNECTED), my_id_(-1) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035
Tomas Gunnarssonabdb4702020-09-05 18:43:36 +020036PeerConnectionClient::~PeerConnectionClient() {
37 rtc::Thread::Current()->Clear(this);
38}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000039
40void PeerConnectionClient::InitSocketSignals() {
nisseede5da42017-01-12 05:15:36 -080041 RTC_DCHECK(control_socket_.get() != NULL);
42 RTC_DCHECK(hanging_get_.get() != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000043 control_socket_->SignalCloseEvent.connect(this,
Yves Gerey665174f2018-06-19 15:03:05 +020044 &PeerConnectionClient::OnClose);
45 hanging_get_->SignalCloseEvent.connect(this, &PeerConnectionClient::OnClose);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000046 control_socket_->SignalConnectEvent.connect(this,
Yves Gerey665174f2018-06-19 15:03:05 +020047 &PeerConnectionClient::OnConnect);
48 hanging_get_->SignalConnectEvent.connect(
49 this, &PeerConnectionClient::OnHangingGetConnect);
50 control_socket_->SignalReadEvent.connect(this, &PeerConnectionClient::OnRead);
51 hanging_get_->SignalReadEvent.connect(
52 this, &PeerConnectionClient::OnHangingGetRead);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000053}
54
55int PeerConnectionClient::id() const {
56 return my_id_;
57}
58
59bool PeerConnectionClient::is_connected() const {
60 return my_id_ != -1;
61}
62
63const Peers& PeerConnectionClient::peers() const {
64 return peers_;
65}
66
67void PeerConnectionClient::RegisterObserver(
68 PeerConnectionClientObserver* callback) {
nisseede5da42017-01-12 05:15:36 -080069 RTC_DCHECK(!callback_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000070 callback_ = callback;
71}
72
Yves Gerey665174f2018-06-19 15:03:05 +020073void PeerConnectionClient::Connect(const std::string& server,
74 int port,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000075 const std::string& client_name) {
nisseede5da42017-01-12 05:15:36 -080076 RTC_DCHECK(!server.empty());
77 RTC_DCHECK(!client_name.empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +000078
79 if (state_ != NOT_CONNECTED) {
Harald Alvestrandef5b21e2021-11-27 21:31:08 +000080 RTC_LOG(LS_WARNING)
henrike@webrtc.org28e20752013-07-10 00:45:36 +000081 << "The client must not be connected before you can call Connect()";
82 callback_->OnServerConnectionFailure();
83 return;
84 }
85
86 if (server.empty() || client_name.empty()) {
87 callback_->OnServerConnectionFailure();
88 return;
89 }
90
91 if (port <= 0)
92 port = kDefaultServerPort;
93
94 server_address_.SetIP(server);
95 server_address_.SetPort(port);
96 client_name_ = client_name;
97
tfarina20a34612015-11-02 16:20:22 -080098 if (server_address_.IsUnresolvedIP()) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000099 state_ = RESOLVING;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000100 resolver_ = new rtc::AsyncResolver();
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000101 resolver_->SignalDone.connect(this, &PeerConnectionClient::OnResolveResult);
102 resolver_->Start(server_address_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103 } else {
104 DoConnect();
105 }
106}
107
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000108void PeerConnectionClient::OnResolveResult(
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000109 rtc::AsyncResolverInterface* resolver) {
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000110 if (resolver_->GetError() != 0) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000111 callback_->OnServerConnectionFailure();
112 resolver_->Destroy(false);
113 resolver_ = NULL;
114 state_ = NOT_CONNECTED;
115 } else {
116 server_address_ = resolver_->address();
117 DoConnect();
118 }
119}
120
121void PeerConnectionClient::DoConnect() {
122 control_socket_.reset(CreateClientSocket(server_address_.ipaddr().family()));
123 hanging_get_.reset(CreateClientSocket(server_address_.ipaddr().family()));
124 InitSocketSignals();
125 char buffer[1024];
Niels Mölleraba06332018-10-16 15:14:15 +0200126 snprintf(buffer, sizeof(buffer), "GET /sign_in?%s HTTP/1.0\r\n\r\n",
Yves Gerey665174f2018-06-19 15:03:05 +0200127 client_name_.c_str());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000128 onconnect_data_ = buffer;
129
130 bool ret = ConnectControlSocket();
131 if (ret)
132 state_ = SIGNING_IN;
133 if (!ret) {
134 callback_->OnServerConnectionFailure();
135 }
136}
137
138bool PeerConnectionClient::SendToPeer(int peer_id, const std::string& message) {
139 if (state_ != CONNECTED)
140 return false;
141
nisseede5da42017-01-12 05:15:36 -0800142 RTC_DCHECK(is_connected());
143 RTC_DCHECK(control_socket_->GetState() == rtc::Socket::CS_CLOSED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000144 if (!is_connected() || peer_id == -1)
145 return false;
146
147 char headers[1024];
Niels Mölleraba06332018-10-16 15:14:15 +0200148 snprintf(headers, sizeof(headers),
Yves Gerey665174f2018-06-19 15:03:05 +0200149 "POST /message?peer_id=%i&to=%i HTTP/1.0\r\n"
Niels Mölleraba06332018-10-16 15:14:15 +0200150 "Content-Length: %zu\r\n"
Yves Gerey665174f2018-06-19 15:03:05 +0200151 "Content-Type: text/plain\r\n"
152 "\r\n",
153 my_id_, peer_id, message.length());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000154 onconnect_data_ = headers;
155 onconnect_data_ += message;
156 return ConnectControlSocket();
157}
158
159bool PeerConnectionClient::SendHangUp(int peer_id) {
160 return SendToPeer(peer_id, kByeMessage);
161}
162
163bool PeerConnectionClient::IsSendingMessage() {
164 return state_ == CONNECTED &&
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000165 control_socket_->GetState() != rtc::Socket::CS_CLOSED;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000166}
167
168bool PeerConnectionClient::SignOut() {
169 if (state_ == NOT_CONNECTED || state_ == SIGNING_OUT)
170 return true;
171
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000172 if (hanging_get_->GetState() != rtc::Socket::CS_CLOSED)
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000173 hanging_get_->Close();
174
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000175 if (control_socket_->GetState() == rtc::Socket::CS_CLOSED) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000176 state_ = SIGNING_OUT;
177
178 if (my_id_ != -1) {
179 char buffer[1024];
Niels Mölleraba06332018-10-16 15:14:15 +0200180 snprintf(buffer, sizeof(buffer),
Yves Gerey665174f2018-06-19 15:03:05 +0200181 "GET /sign_out?peer_id=%i HTTP/1.0\r\n\r\n", my_id_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000182 onconnect_data_ = buffer;
183 return ConnectControlSocket();
184 } else {
185 // Can occur if the app is closed before we finish connecting.
186 return true;
187 }
188 } else {
189 state_ = SIGNING_OUT_WAITING;
190 }
191
192 return true;
193}
194
195void PeerConnectionClient::Close() {
196 control_socket_->Close();
197 hanging_get_->Close();
198 onconnect_data_.clear();
199 peers_.clear();
200 if (resolver_ != NULL) {
201 resolver_->Destroy(false);
202 resolver_ = NULL;
203 }
204 my_id_ = -1;
205 state_ = NOT_CONNECTED;
206}
207
208bool PeerConnectionClient::ConnectControlSocket() {
nisseede5da42017-01-12 05:15:36 -0800209 RTC_DCHECK(control_socket_->GetState() == rtc::Socket::CS_CLOSED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000210 int err = control_socket_->Connect(server_address_);
211 if (err == SOCKET_ERROR) {
212 Close();
213 return false;
214 }
215 return true;
216}
217
Niels Möllerd0b88792021-08-12 10:32:30 +0200218void PeerConnectionClient::OnConnect(rtc::Socket* socket) {
nisseede5da42017-01-12 05:15:36 -0800219 RTC_DCHECK(!onconnect_data_.empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000220 size_t sent = socket->Send(onconnect_data_.c_str(), onconnect_data_.length());
nisseede5da42017-01-12 05:15:36 -0800221 RTC_DCHECK(sent == onconnect_data_.length());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000222 onconnect_data_.clear();
223}
224
Niels Möllerd0b88792021-08-12 10:32:30 +0200225void PeerConnectionClient::OnHangingGetConnect(rtc::Socket* socket) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000226 char buffer[1024];
Niels Mölleraba06332018-10-16 15:14:15 +0200227 snprintf(buffer, sizeof(buffer), "GET /wait?peer_id=%i HTTP/1.0\r\n\r\n",
Yves Gerey665174f2018-06-19 15:03:05 +0200228 my_id_);
henrike@webrtc.org28654cb2013-07-22 21:07:49 +0000229 int len = static_cast<int>(strlen(buffer));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000230 int sent = socket->Send(buffer, len);
nisseede5da42017-01-12 05:15:36 -0800231 RTC_DCHECK(sent == len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000232}
233
234void PeerConnectionClient::OnMessageFromPeer(int peer_id,
235 const std::string& message) {
236 if (message.length() == (sizeof(kByeMessage) - 1) &&
237 message.compare(kByeMessage) == 0) {
238 callback_->OnPeerDisconnected(peer_id);
239 } else {
240 callback_->OnMessageFromPeer(peer_id, message);
241 }
242}
243
244bool PeerConnectionClient::GetHeaderValue(const std::string& data,
245 size_t eoh,
246 const char* header_pattern,
247 size_t* value) {
nisseede5da42017-01-12 05:15:36 -0800248 RTC_DCHECK(value != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000249 size_t found = data.find(header_pattern);
250 if (found != std::string::npos && found < eoh) {
251 *value = atoi(&data[found + strlen(header_pattern)]);
252 return true;
253 }
254 return false;
255}
256
Yves Gerey665174f2018-06-19 15:03:05 +0200257bool PeerConnectionClient::GetHeaderValue(const std::string& data,
258 size_t eoh,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000259 const char* header_pattern,
260 std::string* 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 size_t begin = found + strlen(header_pattern);
265 size_t end = data.find("\r\n", begin);
266 if (end == std::string::npos)
267 end = eoh;
268 value->assign(data.substr(begin, end - begin));
269 return true;
270 }
271 return false;
272}
273
Niels Möllerd0b88792021-08-12 10:32:30 +0200274bool PeerConnectionClient::ReadIntoBuffer(rtc::Socket* socket,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000275 std::string* data,
276 size_t* content_length) {
277 char buffer[0xffff];
278 do {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200279 int bytes = socket->Recv(buffer, sizeof(buffer), nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000280 if (bytes <= 0)
281 break;
282 data->append(buffer, bytes);
283 } while (true);
284
285 bool ret = false;
286 size_t i = data->find("\r\n\r\n");
287 if (i != std::string::npos) {
Harald Alvestrand97597c02021-11-04 12:01:23 +0000288 RTC_LOG(LS_INFO) << "Headers received";
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000289 if (GetHeaderValue(*data, i, "\r\nContent-Length: ", content_length)) {
290 size_t total_response_size = (i + 4) + *content_length;
291 if (data->length() >= total_response_size) {
292 ret = true;
293 std::string should_close;
294 const char kConnection[] = "\r\nConnection: ";
295 if (GetHeaderValue(*data, i, kConnection, &should_close) &&
296 should_close.compare("close") == 0) {
297 socket->Close();
298 // Since we closed the socket, there was no notification delivered
299 // to us. Compensate by letting ourselves know.
300 OnClose(socket, 0);
301 }
302 } else {
303 // We haven't received everything. Just continue to accept data.
304 }
305 } else {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100306 RTC_LOG(LS_ERROR) << "No content length field specified by the server.";
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000307 }
308 }
309 return ret;
310}
311
Niels Möllerd0b88792021-08-12 10:32:30 +0200312void PeerConnectionClient::OnRead(rtc::Socket* socket) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000313 size_t content_length = 0;
314 if (ReadIntoBuffer(socket, &control_data_, &content_length)) {
315 size_t peer_id = 0, eoh = 0;
Yves Gerey665174f2018-06-19 15:03:05 +0200316 bool ok =
317 ParseServerResponse(control_data_, content_length, &peer_id, &eoh);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000318 if (ok) {
319 if (my_id_ == -1) {
320 // First response. Let's store our server assigned ID.
nisseede5da42017-01-12 05:15:36 -0800321 RTC_DCHECK(state_ == SIGNING_IN);
henrike@webrtc.org28654cb2013-07-22 21:07:49 +0000322 my_id_ = static_cast<int>(peer_id);
nisseede5da42017-01-12 05:15:36 -0800323 RTC_DCHECK(my_id_ != -1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000324
325 // The body of the response will be a list of already connected peers.
326 if (content_length) {
327 size_t pos = eoh + 4;
328 while (pos < control_data_.size()) {
329 size_t eol = control_data_.find('\n', pos);
330 if (eol == std::string::npos)
331 break;
332 int id = 0;
333 std::string name;
334 bool connected;
335 if (ParseEntry(control_data_.substr(pos, eol - pos), &name, &id,
Yves Gerey665174f2018-06-19 15:03:05 +0200336 &connected) &&
337 id != my_id_) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000338 peers_[id] = name;
339 callback_->OnPeerConnected(id, name);
340 }
341 pos = eol + 1;
342 }
343 }
nisseede5da42017-01-12 05:15:36 -0800344 RTC_DCHECK(is_connected());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000345 callback_->OnSignedIn();
346 } else if (state_ == SIGNING_OUT) {
347 Close();
348 callback_->OnDisconnected();
349 } else if (state_ == SIGNING_OUT_WAITING) {
350 SignOut();
351 }
352 }
353
354 control_data_.clear();
355
356 if (state_ == SIGNING_IN) {
nisseede5da42017-01-12 05:15:36 -0800357 RTC_DCHECK(hanging_get_->GetState() == rtc::Socket::CS_CLOSED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000358 state_ = CONNECTED;
359 hanging_get_->Connect(server_address_);
360 }
361 }
362}
363
Niels Möllerd0b88792021-08-12 10:32:30 +0200364void PeerConnectionClient::OnHangingGetRead(rtc::Socket* socket) {
Harald Alvestrand97597c02021-11-04 12:01:23 +0000365 RTC_LOG(LS_INFO) << __FUNCTION__;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000366 size_t content_length = 0;
367 if (ReadIntoBuffer(socket, &notification_data_, &content_length)) {
368 size_t peer_id = 0, eoh = 0;
Yves Gerey665174f2018-06-19 15:03:05 +0200369 bool ok =
370 ParseServerResponse(notification_data_, content_length, &peer_id, &eoh);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000371
372 if (ok) {
373 // Store the position where the body begins.
374 size_t pos = eoh + 4;
375
376 if (my_id_ == static_cast<int>(peer_id)) {
377 // A notification about a new member or a member that just
378 // disconnected.
379 int id = 0;
380 std::string name;
381 bool connected = false;
382 if (ParseEntry(notification_data_.substr(pos), &name, &id,
383 &connected)) {
384 if (connected) {
385 peers_[id] = name;
386 callback_->OnPeerConnected(id, name);
387 } else {
388 peers_.erase(id);
389 callback_->OnPeerDisconnected(id);
390 }
391 }
392 } else {
henrike@webrtc.org28654cb2013-07-22 21:07:49 +0000393 OnMessageFromPeer(static_cast<int>(peer_id),
394 notification_data_.substr(pos));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000395 }
396 }
397
398 notification_data_.clear();
399 }
400
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000401 if (hanging_get_->GetState() == rtc::Socket::CS_CLOSED &&
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000402 state_ == CONNECTED) {
403 hanging_get_->Connect(server_address_);
404 }
405}
406
407bool PeerConnectionClient::ParseEntry(const std::string& entry,
408 std::string* name,
409 int* id,
410 bool* connected) {
nisseede5da42017-01-12 05:15:36 -0800411 RTC_DCHECK(name != NULL);
412 RTC_DCHECK(id != NULL);
413 RTC_DCHECK(connected != NULL);
414 RTC_DCHECK(!entry.empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000415
416 *connected = false;
417 size_t separator = entry.find(',');
418 if (separator != std::string::npos) {
419 *id = atoi(&entry[separator + 1]);
420 name->assign(entry.substr(0, separator));
421 separator = entry.find(',', separator + 1);
422 if (separator != std::string::npos) {
423 *connected = atoi(&entry[separator + 1]) ? true : false;
424 }
425 }
426 return !name->empty();
427}
428
429int PeerConnectionClient::GetResponseStatus(const std::string& response) {
430 int status = -1;
431 size_t pos = response.find(' ');
432 if (pos != std::string::npos)
433 status = atoi(&response[pos + 1]);
434 return status;
435}
436
437bool PeerConnectionClient::ParseServerResponse(const std::string& response,
438 size_t content_length,
439 size_t* peer_id,
440 size_t* eoh) {
441 int status = GetResponseStatus(response.c_str());
442 if (status != 200) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100443 RTC_LOG(LS_ERROR) << "Received error from server";
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000444 Close();
445 callback_->OnDisconnected();
446 return false;
447 }
448
449 *eoh = response.find("\r\n\r\n");
nisseede5da42017-01-12 05:15:36 -0800450 RTC_DCHECK(*eoh != std::string::npos);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000451 if (*eoh == std::string::npos)
452 return false;
453
454 *peer_id = -1;
455
Philipp Hancke0240cf82020-09-07 22:13:42 +0200456 // See comment in peer_channel.cc for why we use the Pragma header.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000457 GetHeaderValue(response, *eoh, "\r\nPragma: ", peer_id);
458
459 return true;
460}
461
Niels Möllerd0b88792021-08-12 10:32:30 +0200462void PeerConnectionClient::OnClose(rtc::Socket* socket, int err) {
Harald Alvestrand97597c02021-11-04 12:01:23 +0000463 RTC_LOG(LS_INFO) << __FUNCTION__;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000464
465 socket->Close();
466
467#ifdef WIN32
468 if (err != WSAECONNREFUSED) {
469#else
470 if (err != ECONNREFUSED) {
471#endif
472 if (socket == hanging_get_.get()) {
473 if (state_ == CONNECTED) {
474 hanging_get_->Close();
475 hanging_get_->Connect(server_address_);
476 }
477 } else {
478 callback_->OnMessageSent(err);
479 }
480 } else {
481 if (socket == control_socket_.get()) {
Harald Alvestrandef5b21e2021-11-27 21:31:08 +0000482 RTC_LOG(LS_WARNING) << "Connection refused; retrying in 2 seconds";
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700483 rtc::Thread::Current()->PostDelayed(RTC_FROM_HERE, kReconnectDelay, this,
484 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000485 } else {
486 Close();
487 callback_->OnDisconnected();
488 }
489 }
490}
491
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000492void PeerConnectionClient::OnMessage(rtc::Message* msg) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000493 // ignore msg; there is currently only one supported message ("retry")
494 DoConnect();
495}