blob: 3203941672e817a19d8456838b6c5b78fbbe61b8 [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
18#ifdef WIN32
Steve Anton10542f22019-01-11 09:11:00 -080019#include "rtc_base/win32_socket_server.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000020#endif
21
henrike@webrtc.org28e20752013-07-10 00:45:36 +000022namespace {
23
24// This is our magical hangup signal.
25const char kByeMessage[] = "BYE";
26// Delay between server connection retries, in milliseconds
27const int kReconnectDelay = 2000;
28
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000029rtc::AsyncSocket* CreateClientSocket(int family) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000030#ifdef WIN32
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000031 rtc::Win32Socket* sock = new rtc::Win32Socket();
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032 sock->CreateT(family, SOCK_STREAM);
33 return sock;
Thiago Farina91543732015-04-20 13:14:36 +020034#elif defined(WEBRTC_POSIX)
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000035 rtc::Thread* thread = rtc::Thread::Current();
nisseede5da42017-01-12 05:15:36 -080036 RTC_DCHECK(thread != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000037 return thread->socketserver()->CreateAsyncSocket(family, SOCK_STREAM);
38#else
39#error Platform not supported.
40#endif
41}
42
jbauch70625e52015-12-09 14:18:14 -080043} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000044
45PeerConnectionClient::PeerConnectionClient()
Yves Gerey665174f2018-06-19 15:03:05 +020046 : callback_(NULL), resolver_(NULL), state_(NOT_CONNECTED), my_id_(-1) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000047
Yves Gerey665174f2018-06-19 15:03:05 +020048PeerConnectionClient::~PeerConnectionClient() {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000049
50void PeerConnectionClient::InitSocketSignals() {
nisseede5da42017-01-12 05:15:36 -080051 RTC_DCHECK(control_socket_.get() != NULL);
52 RTC_DCHECK(hanging_get_.get() != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000053 control_socket_->SignalCloseEvent.connect(this,
Yves Gerey665174f2018-06-19 15:03:05 +020054 &PeerConnectionClient::OnClose);
55 hanging_get_->SignalCloseEvent.connect(this, &PeerConnectionClient::OnClose);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000056 control_socket_->SignalConnectEvent.connect(this,
Yves Gerey665174f2018-06-19 15:03:05 +020057 &PeerConnectionClient::OnConnect);
58 hanging_get_->SignalConnectEvent.connect(
59 this, &PeerConnectionClient::OnHangingGetConnect);
60 control_socket_->SignalReadEvent.connect(this, &PeerConnectionClient::OnRead);
61 hanging_get_->SignalReadEvent.connect(
62 this, &PeerConnectionClient::OnHangingGetRead);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000063}
64
65int PeerConnectionClient::id() const {
66 return my_id_;
67}
68
69bool PeerConnectionClient::is_connected() const {
70 return my_id_ != -1;
71}
72
73const Peers& PeerConnectionClient::peers() const {
74 return peers_;
75}
76
77void PeerConnectionClient::RegisterObserver(
78 PeerConnectionClientObserver* callback) {
nisseede5da42017-01-12 05:15:36 -080079 RTC_DCHECK(!callback_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080 callback_ = callback;
81}
82
Yves Gerey665174f2018-06-19 15:03:05 +020083void PeerConnectionClient::Connect(const std::string& server,
84 int port,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000085 const std::string& client_name) {
nisseede5da42017-01-12 05:15:36 -080086 RTC_DCHECK(!server.empty());
87 RTC_DCHECK(!client_name.empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088
89 if (state_ != NOT_CONNECTED) {
Mirko Bonadei675513b2017-11-09 11:09:25 +010090 RTC_LOG(WARNING)
henrike@webrtc.org28e20752013-07-10 00:45:36 +000091 << "The client must not be connected before you can call Connect()";
92 callback_->OnServerConnectionFailure();
93 return;
94 }
95
96 if (server.empty() || client_name.empty()) {
97 callback_->OnServerConnectionFailure();
98 return;
99 }
100
101 if (port <= 0)
102 port = kDefaultServerPort;
103
104 server_address_.SetIP(server);
105 server_address_.SetPort(port);
106 client_name_ = client_name;
107
tfarina20a34612015-11-02 16:20:22 -0800108 if (server_address_.IsUnresolvedIP()) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000109 state_ = RESOLVING;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000110 resolver_ = new rtc::AsyncResolver();
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000111 resolver_->SignalDone.connect(this, &PeerConnectionClient::OnResolveResult);
112 resolver_->Start(server_address_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000113 } else {
114 DoConnect();
115 }
116}
117
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000118void PeerConnectionClient::OnResolveResult(
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000119 rtc::AsyncResolverInterface* resolver) {
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000120 if (resolver_->GetError() != 0) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000121 callback_->OnServerConnectionFailure();
122 resolver_->Destroy(false);
123 resolver_ = NULL;
124 state_ = NOT_CONNECTED;
125 } else {
126 server_address_ = resolver_->address();
127 DoConnect();
128 }
129}
130
131void PeerConnectionClient::DoConnect() {
132 control_socket_.reset(CreateClientSocket(server_address_.ipaddr().family()));
133 hanging_get_.reset(CreateClientSocket(server_address_.ipaddr().family()));
134 InitSocketSignals();
135 char buffer[1024];
Niels Mölleraba06332018-10-16 15:14:15 +0200136 snprintf(buffer, sizeof(buffer), "GET /sign_in?%s HTTP/1.0\r\n\r\n",
Yves Gerey665174f2018-06-19 15:03:05 +0200137 client_name_.c_str());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000138 onconnect_data_ = buffer;
139
140 bool ret = ConnectControlSocket();
141 if (ret)
142 state_ = SIGNING_IN;
143 if (!ret) {
144 callback_->OnServerConnectionFailure();
145 }
146}
147
148bool PeerConnectionClient::SendToPeer(int peer_id, const std::string& message) {
149 if (state_ != CONNECTED)
150 return false;
151
nisseede5da42017-01-12 05:15:36 -0800152 RTC_DCHECK(is_connected());
153 RTC_DCHECK(control_socket_->GetState() == rtc::Socket::CS_CLOSED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000154 if (!is_connected() || peer_id == -1)
155 return false;
156
157 char headers[1024];
Niels Mölleraba06332018-10-16 15:14:15 +0200158 snprintf(headers, sizeof(headers),
Yves Gerey665174f2018-06-19 15:03:05 +0200159 "POST /message?peer_id=%i&to=%i HTTP/1.0\r\n"
Niels Mölleraba06332018-10-16 15:14:15 +0200160 "Content-Length: %zu\r\n"
Yves Gerey665174f2018-06-19 15:03:05 +0200161 "Content-Type: text/plain\r\n"
162 "\r\n",
163 my_id_, peer_id, message.length());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000164 onconnect_data_ = headers;
165 onconnect_data_ += message;
166 return ConnectControlSocket();
167}
168
169bool PeerConnectionClient::SendHangUp(int peer_id) {
170 return SendToPeer(peer_id, kByeMessage);
171}
172
173bool PeerConnectionClient::IsSendingMessage() {
174 return state_ == CONNECTED &&
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000175 control_socket_->GetState() != rtc::Socket::CS_CLOSED;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000176}
177
178bool PeerConnectionClient::SignOut() {
179 if (state_ == NOT_CONNECTED || state_ == SIGNING_OUT)
180 return true;
181
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000182 if (hanging_get_->GetState() != rtc::Socket::CS_CLOSED)
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000183 hanging_get_->Close();
184
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000185 if (control_socket_->GetState() == rtc::Socket::CS_CLOSED) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000186 state_ = SIGNING_OUT;
187
188 if (my_id_ != -1) {
189 char buffer[1024];
Niels Mölleraba06332018-10-16 15:14:15 +0200190 snprintf(buffer, sizeof(buffer),
Yves Gerey665174f2018-06-19 15:03:05 +0200191 "GET /sign_out?peer_id=%i HTTP/1.0\r\n\r\n", my_id_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000192 onconnect_data_ = buffer;
193 return ConnectControlSocket();
194 } else {
195 // Can occur if the app is closed before we finish connecting.
196 return true;
197 }
198 } else {
199 state_ = SIGNING_OUT_WAITING;
200 }
201
202 return true;
203}
204
205void PeerConnectionClient::Close() {
206 control_socket_->Close();
207 hanging_get_->Close();
208 onconnect_data_.clear();
209 peers_.clear();
210 if (resolver_ != NULL) {
211 resolver_->Destroy(false);
212 resolver_ = NULL;
213 }
214 my_id_ = -1;
215 state_ = NOT_CONNECTED;
216}
217
218bool PeerConnectionClient::ConnectControlSocket() {
nisseede5da42017-01-12 05:15:36 -0800219 RTC_DCHECK(control_socket_->GetState() == rtc::Socket::CS_CLOSED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000220 int err = control_socket_->Connect(server_address_);
221 if (err == SOCKET_ERROR) {
222 Close();
223 return false;
224 }
225 return true;
226}
227
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000228void PeerConnectionClient::OnConnect(rtc::AsyncSocket* socket) {
nisseede5da42017-01-12 05:15:36 -0800229 RTC_DCHECK(!onconnect_data_.empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000230 size_t sent = socket->Send(onconnect_data_.c_str(), onconnect_data_.length());
nisseede5da42017-01-12 05:15:36 -0800231 RTC_DCHECK(sent == onconnect_data_.length());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000232 onconnect_data_.clear();
233}
234
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000235void PeerConnectionClient::OnHangingGetConnect(rtc::AsyncSocket* socket) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000236 char buffer[1024];
Niels Mölleraba06332018-10-16 15:14:15 +0200237 snprintf(buffer, sizeof(buffer), "GET /wait?peer_id=%i HTTP/1.0\r\n\r\n",
Yves Gerey665174f2018-06-19 15:03:05 +0200238 my_id_);
henrike@webrtc.org28654cb2013-07-22 21:07:49 +0000239 int len = static_cast<int>(strlen(buffer));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000240 int sent = socket->Send(buffer, len);
nisseede5da42017-01-12 05:15:36 -0800241 RTC_DCHECK(sent == len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000242}
243
244void PeerConnectionClient::OnMessageFromPeer(int peer_id,
245 const std::string& message) {
246 if (message.length() == (sizeof(kByeMessage) - 1) &&
247 message.compare(kByeMessage) == 0) {
248 callback_->OnPeerDisconnected(peer_id);
249 } else {
250 callback_->OnMessageFromPeer(peer_id, message);
251 }
252}
253
254bool PeerConnectionClient::GetHeaderValue(const std::string& data,
255 size_t eoh,
256 const char* header_pattern,
257 size_t* value) {
nisseede5da42017-01-12 05:15:36 -0800258 RTC_DCHECK(value != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000259 size_t found = data.find(header_pattern);
260 if (found != std::string::npos && found < eoh) {
261 *value = atoi(&data[found + strlen(header_pattern)]);
262 return true;
263 }
264 return false;
265}
266
Yves Gerey665174f2018-06-19 15:03:05 +0200267bool PeerConnectionClient::GetHeaderValue(const std::string& data,
268 size_t eoh,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000269 const char* header_pattern,
270 std::string* value) {
nisseede5da42017-01-12 05:15:36 -0800271 RTC_DCHECK(value != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000272 size_t found = data.find(header_pattern);
273 if (found != std::string::npos && found < eoh) {
274 size_t begin = found + strlen(header_pattern);
275 size_t end = data.find("\r\n", begin);
276 if (end == std::string::npos)
277 end = eoh;
278 value->assign(data.substr(begin, end - begin));
279 return true;
280 }
281 return false;
282}
283
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000284bool PeerConnectionClient::ReadIntoBuffer(rtc::AsyncSocket* socket,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000285 std::string* data,
286 size_t* content_length) {
287 char buffer[0xffff];
288 do {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200289 int bytes = socket->Recv(buffer, sizeof(buffer), nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000290 if (bytes <= 0)
291 break;
292 data->append(buffer, bytes);
293 } while (true);
294
295 bool ret = false;
296 size_t i = data->find("\r\n\r\n");
297 if (i != std::string::npos) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100298 RTC_LOG(INFO) << "Headers received";
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000299 if (GetHeaderValue(*data, i, "\r\nContent-Length: ", content_length)) {
300 size_t total_response_size = (i + 4) + *content_length;
301 if (data->length() >= total_response_size) {
302 ret = true;
303 std::string should_close;
304 const char kConnection[] = "\r\nConnection: ";
305 if (GetHeaderValue(*data, i, kConnection, &should_close) &&
306 should_close.compare("close") == 0) {
307 socket->Close();
308 // Since we closed the socket, there was no notification delivered
309 // to us. Compensate by letting ourselves know.
310 OnClose(socket, 0);
311 }
312 } else {
313 // We haven't received everything. Just continue to accept data.
314 }
315 } else {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100316 RTC_LOG(LS_ERROR) << "No content length field specified by the server.";
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000317 }
318 }
319 return ret;
320}
321
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000322void PeerConnectionClient::OnRead(rtc::AsyncSocket* socket) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000323 size_t content_length = 0;
324 if (ReadIntoBuffer(socket, &control_data_, &content_length)) {
325 size_t peer_id = 0, eoh = 0;
Yves Gerey665174f2018-06-19 15:03:05 +0200326 bool ok =
327 ParseServerResponse(control_data_, content_length, &peer_id, &eoh);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000328 if (ok) {
329 if (my_id_ == -1) {
330 // First response. Let's store our server assigned ID.
nisseede5da42017-01-12 05:15:36 -0800331 RTC_DCHECK(state_ == SIGNING_IN);
henrike@webrtc.org28654cb2013-07-22 21:07:49 +0000332 my_id_ = static_cast<int>(peer_id);
nisseede5da42017-01-12 05:15:36 -0800333 RTC_DCHECK(my_id_ != -1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000334
335 // The body of the response will be a list of already connected peers.
336 if (content_length) {
337 size_t pos = eoh + 4;
338 while (pos < control_data_.size()) {
339 size_t eol = control_data_.find('\n', pos);
340 if (eol == std::string::npos)
341 break;
342 int id = 0;
343 std::string name;
344 bool connected;
345 if (ParseEntry(control_data_.substr(pos, eol - pos), &name, &id,
Yves Gerey665174f2018-06-19 15:03:05 +0200346 &connected) &&
347 id != my_id_) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000348 peers_[id] = name;
349 callback_->OnPeerConnected(id, name);
350 }
351 pos = eol + 1;
352 }
353 }
nisseede5da42017-01-12 05:15:36 -0800354 RTC_DCHECK(is_connected());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000355 callback_->OnSignedIn();
356 } else if (state_ == SIGNING_OUT) {
357 Close();
358 callback_->OnDisconnected();
359 } else if (state_ == SIGNING_OUT_WAITING) {
360 SignOut();
361 }
362 }
363
364 control_data_.clear();
365
366 if (state_ == SIGNING_IN) {
nisseede5da42017-01-12 05:15:36 -0800367 RTC_DCHECK(hanging_get_->GetState() == rtc::Socket::CS_CLOSED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000368 state_ = CONNECTED;
369 hanging_get_->Connect(server_address_);
370 }
371 }
372}
373
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000374void PeerConnectionClient::OnHangingGetRead(rtc::AsyncSocket* socket) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100375 RTC_LOG(INFO) << __FUNCTION__;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000376 size_t content_length = 0;
377 if (ReadIntoBuffer(socket, &notification_data_, &content_length)) {
378 size_t peer_id = 0, eoh = 0;
Yves Gerey665174f2018-06-19 15:03:05 +0200379 bool ok =
380 ParseServerResponse(notification_data_, content_length, &peer_id, &eoh);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000381
382 if (ok) {
383 // Store the position where the body begins.
384 size_t pos = eoh + 4;
385
386 if (my_id_ == static_cast<int>(peer_id)) {
387 // A notification about a new member or a member that just
388 // disconnected.
389 int id = 0;
390 std::string name;
391 bool connected = false;
392 if (ParseEntry(notification_data_.substr(pos), &name, &id,
393 &connected)) {
394 if (connected) {
395 peers_[id] = name;
396 callback_->OnPeerConnected(id, name);
397 } else {
398 peers_.erase(id);
399 callback_->OnPeerDisconnected(id);
400 }
401 }
402 } else {
henrike@webrtc.org28654cb2013-07-22 21:07:49 +0000403 OnMessageFromPeer(static_cast<int>(peer_id),
404 notification_data_.substr(pos));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000405 }
406 }
407
408 notification_data_.clear();
409 }
410
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000411 if (hanging_get_->GetState() == rtc::Socket::CS_CLOSED &&
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000412 state_ == CONNECTED) {
413 hanging_get_->Connect(server_address_);
414 }
415}
416
417bool PeerConnectionClient::ParseEntry(const std::string& entry,
418 std::string* name,
419 int* id,
420 bool* connected) {
nisseede5da42017-01-12 05:15:36 -0800421 RTC_DCHECK(name != NULL);
422 RTC_DCHECK(id != NULL);
423 RTC_DCHECK(connected != NULL);
424 RTC_DCHECK(!entry.empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000425
426 *connected = false;
427 size_t separator = entry.find(',');
428 if (separator != std::string::npos) {
429 *id = atoi(&entry[separator + 1]);
430 name->assign(entry.substr(0, separator));
431 separator = entry.find(',', separator + 1);
432 if (separator != std::string::npos) {
433 *connected = atoi(&entry[separator + 1]) ? true : false;
434 }
435 }
436 return !name->empty();
437}
438
439int PeerConnectionClient::GetResponseStatus(const std::string& response) {
440 int status = -1;
441 size_t pos = response.find(' ');
442 if (pos != std::string::npos)
443 status = atoi(&response[pos + 1]);
444 return status;
445}
446
447bool PeerConnectionClient::ParseServerResponse(const std::string& response,
448 size_t content_length,
449 size_t* peer_id,
450 size_t* eoh) {
451 int status = GetResponseStatus(response.c_str());
452 if (status != 200) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100453 RTC_LOG(LS_ERROR) << "Received error from server";
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000454 Close();
455 callback_->OnDisconnected();
456 return false;
457 }
458
459 *eoh = response.find("\r\n\r\n");
nisseede5da42017-01-12 05:15:36 -0800460 RTC_DCHECK(*eoh != std::string::npos);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000461 if (*eoh == std::string::npos)
462 return false;
463
464 *peer_id = -1;
465
466 // See comment in peer_channel.cc for why we use the Pragma header and
467 // not e.g. "X-Peer-Id".
468 GetHeaderValue(response, *eoh, "\r\nPragma: ", peer_id);
469
470 return true;
471}
472
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000473void PeerConnectionClient::OnClose(rtc::AsyncSocket* socket, int err) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100474 RTC_LOG(INFO) << __FUNCTION__;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000475
476 socket->Close();
477
478#ifdef WIN32
479 if (err != WSAECONNREFUSED) {
480#else
481 if (err != ECONNREFUSED) {
482#endif
483 if (socket == hanging_get_.get()) {
484 if (state_ == CONNECTED) {
485 hanging_get_->Close();
486 hanging_get_->Connect(server_address_);
487 }
488 } else {
489 callback_->OnMessageSent(err);
490 }
491 } else {
492 if (socket == control_socket_.get()) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100493 RTC_LOG(WARNING) << "Connection refused; retrying in 2 seconds";
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700494 rtc::Thread::Current()->PostDelayed(RTC_FROM_HERE, kReconnectDelay, this,
495 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000496 } else {
497 Close();
498 callback_->OnDisconnected();
499 }
500 }
501}
502
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000503void PeerConnectionClient::OnMessage(rtc::Message* msg) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000504 // ignore msg; there is currently only one supported message ("retry")
505 DoConnect();
506}