blob: b76b925bdaed95b1eec32ab309dfcff6d77167a9 [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
Niels Möllerd0b88792021-08-12 10:32:30 +020029rtc::Socket* 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);
Niels Möllerd0b88792021-08-12 10:32:30 +020037 return thread->socketserver()->CreateSocket(family, SOCK_STREAM);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000038#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()
Tomas Gunnarsson77baeee2020-09-24 22:39:21 +020046 : callback_(NULL), resolver_(NULL), state_(NOT_CONNECTED), my_id_(-1) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000047
Tomas Gunnarssonabdb4702020-09-05 18:43:36 +020048PeerConnectionClient::~PeerConnectionClient() {
49 rtc::Thread::Current()->Clear(this);
50}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000051
52void PeerConnectionClient::InitSocketSignals() {
nisseede5da42017-01-12 05:15:36 -080053 RTC_DCHECK(control_socket_.get() != NULL);
54 RTC_DCHECK(hanging_get_.get() != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055 control_socket_->SignalCloseEvent.connect(this,
Yves Gerey665174f2018-06-19 15:03:05 +020056 &PeerConnectionClient::OnClose);
57 hanging_get_->SignalCloseEvent.connect(this, &PeerConnectionClient::OnClose);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058 control_socket_->SignalConnectEvent.connect(this,
Yves Gerey665174f2018-06-19 15:03:05 +020059 &PeerConnectionClient::OnConnect);
60 hanging_get_->SignalConnectEvent.connect(
61 this, &PeerConnectionClient::OnHangingGetConnect);
62 control_socket_->SignalReadEvent.connect(this, &PeerConnectionClient::OnRead);
63 hanging_get_->SignalReadEvent.connect(
64 this, &PeerConnectionClient::OnHangingGetRead);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065}
66
67int PeerConnectionClient::id() const {
68 return my_id_;
69}
70
71bool PeerConnectionClient::is_connected() const {
72 return my_id_ != -1;
73}
74
75const Peers& PeerConnectionClient::peers() const {
76 return peers_;
77}
78
79void PeerConnectionClient::RegisterObserver(
80 PeerConnectionClientObserver* callback) {
nisseede5da42017-01-12 05:15:36 -080081 RTC_DCHECK(!callback_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082 callback_ = callback;
83}
84
Yves Gerey665174f2018-06-19 15:03:05 +020085void PeerConnectionClient::Connect(const std::string& server,
86 int port,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000087 const std::string& client_name) {
nisseede5da42017-01-12 05:15:36 -080088 RTC_DCHECK(!server.empty());
89 RTC_DCHECK(!client_name.empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +000090
91 if (state_ != NOT_CONNECTED) {
Mirko Bonadei675513b2017-11-09 11:09:25 +010092 RTC_LOG(WARNING)
henrike@webrtc.org28e20752013-07-10 00:45:36 +000093 << "The client must not be connected before you can call Connect()";
94 callback_->OnServerConnectionFailure();
95 return;
96 }
97
98 if (server.empty() || client_name.empty()) {
99 callback_->OnServerConnectionFailure();
100 return;
101 }
102
103 if (port <= 0)
104 port = kDefaultServerPort;
105
106 server_address_.SetIP(server);
107 server_address_.SetPort(port);
108 client_name_ = client_name;
109
tfarina20a34612015-11-02 16:20:22 -0800110 if (server_address_.IsUnresolvedIP()) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000111 state_ = RESOLVING;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000112 resolver_ = new rtc::AsyncResolver();
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000113 resolver_->SignalDone.connect(this, &PeerConnectionClient::OnResolveResult);
114 resolver_->Start(server_address_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000115 } else {
116 DoConnect();
117 }
118}
119
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000120void PeerConnectionClient::OnResolveResult(
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000121 rtc::AsyncResolverInterface* resolver) {
sergeyu@chromium.orga23f0ca2013-11-13 22:48:52 +0000122 if (resolver_->GetError() != 0) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123 callback_->OnServerConnectionFailure();
124 resolver_->Destroy(false);
125 resolver_ = NULL;
126 state_ = NOT_CONNECTED;
127 } else {
128 server_address_ = resolver_->address();
129 DoConnect();
130 }
131}
132
133void PeerConnectionClient::DoConnect() {
134 control_socket_.reset(CreateClientSocket(server_address_.ipaddr().family()));
135 hanging_get_.reset(CreateClientSocket(server_address_.ipaddr().family()));
136 InitSocketSignals();
137 char buffer[1024];
Niels Mölleraba06332018-10-16 15:14:15 +0200138 snprintf(buffer, sizeof(buffer), "GET /sign_in?%s HTTP/1.0\r\n\r\n",
Yves Gerey665174f2018-06-19 15:03:05 +0200139 client_name_.c_str());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000140 onconnect_data_ = buffer;
141
142 bool ret = ConnectControlSocket();
143 if (ret)
144 state_ = SIGNING_IN;
145 if (!ret) {
146 callback_->OnServerConnectionFailure();
147 }
148}
149
150bool PeerConnectionClient::SendToPeer(int peer_id, const std::string& message) {
151 if (state_ != CONNECTED)
152 return false;
153
nisseede5da42017-01-12 05:15:36 -0800154 RTC_DCHECK(is_connected());
155 RTC_DCHECK(control_socket_->GetState() == rtc::Socket::CS_CLOSED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000156 if (!is_connected() || peer_id == -1)
157 return false;
158
159 char headers[1024];
Niels Mölleraba06332018-10-16 15:14:15 +0200160 snprintf(headers, sizeof(headers),
Yves Gerey665174f2018-06-19 15:03:05 +0200161 "POST /message?peer_id=%i&to=%i HTTP/1.0\r\n"
Niels Mölleraba06332018-10-16 15:14:15 +0200162 "Content-Length: %zu\r\n"
Yves Gerey665174f2018-06-19 15:03:05 +0200163 "Content-Type: text/plain\r\n"
164 "\r\n",
165 my_id_, peer_id, message.length());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000166 onconnect_data_ = headers;
167 onconnect_data_ += message;
168 return ConnectControlSocket();
169}
170
171bool PeerConnectionClient::SendHangUp(int peer_id) {
172 return SendToPeer(peer_id, kByeMessage);
173}
174
175bool PeerConnectionClient::IsSendingMessage() {
176 return state_ == CONNECTED &&
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000177 control_socket_->GetState() != rtc::Socket::CS_CLOSED;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000178}
179
180bool PeerConnectionClient::SignOut() {
181 if (state_ == NOT_CONNECTED || state_ == SIGNING_OUT)
182 return true;
183
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000184 if (hanging_get_->GetState() != rtc::Socket::CS_CLOSED)
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000185 hanging_get_->Close();
186
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000187 if (control_socket_->GetState() == rtc::Socket::CS_CLOSED) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000188 state_ = SIGNING_OUT;
189
190 if (my_id_ != -1) {
191 char buffer[1024];
Niels Mölleraba06332018-10-16 15:14:15 +0200192 snprintf(buffer, sizeof(buffer),
Yves Gerey665174f2018-06-19 15:03:05 +0200193 "GET /sign_out?peer_id=%i HTTP/1.0\r\n\r\n", my_id_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000194 onconnect_data_ = buffer;
195 return ConnectControlSocket();
196 } else {
197 // Can occur if the app is closed before we finish connecting.
198 return true;
199 }
200 } else {
201 state_ = SIGNING_OUT_WAITING;
202 }
203
204 return true;
205}
206
207void PeerConnectionClient::Close() {
208 control_socket_->Close();
209 hanging_get_->Close();
210 onconnect_data_.clear();
211 peers_.clear();
212 if (resolver_ != NULL) {
213 resolver_->Destroy(false);
214 resolver_ = NULL;
215 }
216 my_id_ = -1;
217 state_ = NOT_CONNECTED;
218}
219
220bool PeerConnectionClient::ConnectControlSocket() {
nisseede5da42017-01-12 05:15:36 -0800221 RTC_DCHECK(control_socket_->GetState() == rtc::Socket::CS_CLOSED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000222 int err = control_socket_->Connect(server_address_);
223 if (err == SOCKET_ERROR) {
224 Close();
225 return false;
226 }
227 return true;
228}
229
Niels Möllerd0b88792021-08-12 10:32:30 +0200230void PeerConnectionClient::OnConnect(rtc::Socket* socket) {
nisseede5da42017-01-12 05:15:36 -0800231 RTC_DCHECK(!onconnect_data_.empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000232 size_t sent = socket->Send(onconnect_data_.c_str(), onconnect_data_.length());
nisseede5da42017-01-12 05:15:36 -0800233 RTC_DCHECK(sent == onconnect_data_.length());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000234 onconnect_data_.clear();
235}
236
Niels Möllerd0b88792021-08-12 10:32:30 +0200237void PeerConnectionClient::OnHangingGetConnect(rtc::Socket* socket) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000238 char buffer[1024];
Niels Mölleraba06332018-10-16 15:14:15 +0200239 snprintf(buffer, sizeof(buffer), "GET /wait?peer_id=%i HTTP/1.0\r\n\r\n",
Yves Gerey665174f2018-06-19 15:03:05 +0200240 my_id_);
henrike@webrtc.org28654cb2013-07-22 21:07:49 +0000241 int len = static_cast<int>(strlen(buffer));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000242 int sent = socket->Send(buffer, len);
nisseede5da42017-01-12 05:15:36 -0800243 RTC_DCHECK(sent == len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000244}
245
246void PeerConnectionClient::OnMessageFromPeer(int peer_id,
247 const std::string& message) {
248 if (message.length() == (sizeof(kByeMessage) - 1) &&
249 message.compare(kByeMessage) == 0) {
250 callback_->OnPeerDisconnected(peer_id);
251 } else {
252 callback_->OnMessageFromPeer(peer_id, message);
253 }
254}
255
256bool PeerConnectionClient::GetHeaderValue(const std::string& data,
257 size_t eoh,
258 const char* header_pattern,
259 size_t* value) {
nisseede5da42017-01-12 05:15:36 -0800260 RTC_DCHECK(value != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000261 size_t found = data.find(header_pattern);
262 if (found != std::string::npos && found < eoh) {
263 *value = atoi(&data[found + strlen(header_pattern)]);
264 return true;
265 }
266 return false;
267}
268
Yves Gerey665174f2018-06-19 15:03:05 +0200269bool PeerConnectionClient::GetHeaderValue(const std::string& data,
270 size_t eoh,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000271 const char* header_pattern,
272 std::string* value) {
nisseede5da42017-01-12 05:15:36 -0800273 RTC_DCHECK(value != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000274 size_t found = data.find(header_pattern);
275 if (found != std::string::npos && found < eoh) {
276 size_t begin = found + strlen(header_pattern);
277 size_t end = data.find("\r\n", begin);
278 if (end == std::string::npos)
279 end = eoh;
280 value->assign(data.substr(begin, end - begin));
281 return true;
282 }
283 return false;
284}
285
Niels Möllerd0b88792021-08-12 10:32:30 +0200286bool PeerConnectionClient::ReadIntoBuffer(rtc::Socket* socket,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000287 std::string* data,
288 size_t* content_length) {
289 char buffer[0xffff];
290 do {
Stefan Holmer9131efd2016-05-23 18:19:26 +0200291 int bytes = socket->Recv(buffer, sizeof(buffer), nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000292 if (bytes <= 0)
293 break;
294 data->append(buffer, bytes);
295 } while (true);
296
297 bool ret = false;
298 size_t i = data->find("\r\n\r\n");
299 if (i != std::string::npos) {
Harald Alvestrand97597c02021-11-04 12:01:23 +0000300 RTC_LOG(LS_INFO) << "Headers received";
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000301 if (GetHeaderValue(*data, i, "\r\nContent-Length: ", content_length)) {
302 size_t total_response_size = (i + 4) + *content_length;
303 if (data->length() >= total_response_size) {
304 ret = true;
305 std::string should_close;
306 const char kConnection[] = "\r\nConnection: ";
307 if (GetHeaderValue(*data, i, kConnection, &should_close) &&
308 should_close.compare("close") == 0) {
309 socket->Close();
310 // Since we closed the socket, there was no notification delivered
311 // to us. Compensate by letting ourselves know.
312 OnClose(socket, 0);
313 }
314 } else {
315 // We haven't received everything. Just continue to accept data.
316 }
317 } else {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100318 RTC_LOG(LS_ERROR) << "No content length field specified by the server.";
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000319 }
320 }
321 return ret;
322}
323
Niels Möllerd0b88792021-08-12 10:32:30 +0200324void PeerConnectionClient::OnRead(rtc::Socket* socket) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000325 size_t content_length = 0;
326 if (ReadIntoBuffer(socket, &control_data_, &content_length)) {
327 size_t peer_id = 0, eoh = 0;
Yves Gerey665174f2018-06-19 15:03:05 +0200328 bool ok =
329 ParseServerResponse(control_data_, content_length, &peer_id, &eoh);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000330 if (ok) {
331 if (my_id_ == -1) {
332 // First response. Let's store our server assigned ID.
nisseede5da42017-01-12 05:15:36 -0800333 RTC_DCHECK(state_ == SIGNING_IN);
henrike@webrtc.org28654cb2013-07-22 21:07:49 +0000334 my_id_ = static_cast<int>(peer_id);
nisseede5da42017-01-12 05:15:36 -0800335 RTC_DCHECK(my_id_ != -1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000336
337 // The body of the response will be a list of already connected peers.
338 if (content_length) {
339 size_t pos = eoh + 4;
340 while (pos < control_data_.size()) {
341 size_t eol = control_data_.find('\n', pos);
342 if (eol == std::string::npos)
343 break;
344 int id = 0;
345 std::string name;
346 bool connected;
347 if (ParseEntry(control_data_.substr(pos, eol - pos), &name, &id,
Yves Gerey665174f2018-06-19 15:03:05 +0200348 &connected) &&
349 id != my_id_) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000350 peers_[id] = name;
351 callback_->OnPeerConnected(id, name);
352 }
353 pos = eol + 1;
354 }
355 }
nisseede5da42017-01-12 05:15:36 -0800356 RTC_DCHECK(is_connected());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000357 callback_->OnSignedIn();
358 } else if (state_ == SIGNING_OUT) {
359 Close();
360 callback_->OnDisconnected();
361 } else if (state_ == SIGNING_OUT_WAITING) {
362 SignOut();
363 }
364 }
365
366 control_data_.clear();
367
368 if (state_ == SIGNING_IN) {
nisseede5da42017-01-12 05:15:36 -0800369 RTC_DCHECK(hanging_get_->GetState() == rtc::Socket::CS_CLOSED);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000370 state_ = CONNECTED;
371 hanging_get_->Connect(server_address_);
372 }
373 }
374}
375
Niels Möllerd0b88792021-08-12 10:32:30 +0200376void PeerConnectionClient::OnHangingGetRead(rtc::Socket* socket) {
Harald Alvestrand97597c02021-11-04 12:01:23 +0000377 RTC_LOG(LS_INFO) << __FUNCTION__;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000378 size_t content_length = 0;
379 if (ReadIntoBuffer(socket, &notification_data_, &content_length)) {
380 size_t peer_id = 0, eoh = 0;
Yves Gerey665174f2018-06-19 15:03:05 +0200381 bool ok =
382 ParseServerResponse(notification_data_, content_length, &peer_id, &eoh);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000383
384 if (ok) {
385 // Store the position where the body begins.
386 size_t pos = eoh + 4;
387
388 if (my_id_ == static_cast<int>(peer_id)) {
389 // A notification about a new member or a member that just
390 // disconnected.
391 int id = 0;
392 std::string name;
393 bool connected = false;
394 if (ParseEntry(notification_data_.substr(pos), &name, &id,
395 &connected)) {
396 if (connected) {
397 peers_[id] = name;
398 callback_->OnPeerConnected(id, name);
399 } else {
400 peers_.erase(id);
401 callback_->OnPeerDisconnected(id);
402 }
403 }
404 } else {
henrike@webrtc.org28654cb2013-07-22 21:07:49 +0000405 OnMessageFromPeer(static_cast<int>(peer_id),
406 notification_data_.substr(pos));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000407 }
408 }
409
410 notification_data_.clear();
411 }
412
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000413 if (hanging_get_->GetState() == rtc::Socket::CS_CLOSED &&
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414 state_ == CONNECTED) {
415 hanging_get_->Connect(server_address_);
416 }
417}
418
419bool PeerConnectionClient::ParseEntry(const std::string& entry,
420 std::string* name,
421 int* id,
422 bool* connected) {
nisseede5da42017-01-12 05:15:36 -0800423 RTC_DCHECK(name != NULL);
424 RTC_DCHECK(id != NULL);
425 RTC_DCHECK(connected != NULL);
426 RTC_DCHECK(!entry.empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000427
428 *connected = false;
429 size_t separator = entry.find(',');
430 if (separator != std::string::npos) {
431 *id = atoi(&entry[separator + 1]);
432 name->assign(entry.substr(0, separator));
433 separator = entry.find(',', separator + 1);
434 if (separator != std::string::npos) {
435 *connected = atoi(&entry[separator + 1]) ? true : false;
436 }
437 }
438 return !name->empty();
439}
440
441int PeerConnectionClient::GetResponseStatus(const std::string& response) {
442 int status = -1;
443 size_t pos = response.find(' ');
444 if (pos != std::string::npos)
445 status = atoi(&response[pos + 1]);
446 return status;
447}
448
449bool PeerConnectionClient::ParseServerResponse(const std::string& response,
450 size_t content_length,
451 size_t* peer_id,
452 size_t* eoh) {
453 int status = GetResponseStatus(response.c_str());
454 if (status != 200) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100455 RTC_LOG(LS_ERROR) << "Received error from server";
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000456 Close();
457 callback_->OnDisconnected();
458 return false;
459 }
460
461 *eoh = response.find("\r\n\r\n");
nisseede5da42017-01-12 05:15:36 -0800462 RTC_DCHECK(*eoh != std::string::npos);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000463 if (*eoh == std::string::npos)
464 return false;
465
466 *peer_id = -1;
467
Philipp Hancke0240cf82020-09-07 22:13:42 +0200468 // See comment in peer_channel.cc for why we use the Pragma header.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000469 GetHeaderValue(response, *eoh, "\r\nPragma: ", peer_id);
470
471 return true;
472}
473
Niels Möllerd0b88792021-08-12 10:32:30 +0200474void PeerConnectionClient::OnClose(rtc::Socket* socket, int err) {
Harald Alvestrand97597c02021-11-04 12:01:23 +0000475 RTC_LOG(LS_INFO) << __FUNCTION__;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000476
477 socket->Close();
478
479#ifdef WIN32
480 if (err != WSAECONNREFUSED) {
481#else
482 if (err != ECONNREFUSED) {
483#endif
484 if (socket == hanging_get_.get()) {
485 if (state_ == CONNECTED) {
486 hanging_get_->Close();
487 hanging_get_->Connect(server_address_);
488 }
489 } else {
490 callback_->OnMessageSent(err);
491 }
492 } else {
493 if (socket == control_socket_.get()) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100494 RTC_LOG(WARNING) << "Connection refused; retrying in 2 seconds";
Taylor Brandstetter5d97a9a2016-06-10 14:17:27 -0700495 rtc::Thread::Current()->PostDelayed(RTC_FROM_HERE, kReconnectDelay, this,
496 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000497 } else {
498 Close();
499 callback_->OnDisconnected();
500 }
501 }
502}
503
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000504void PeerConnectionClient::OnMessage(rtc::Message* msg) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000505 // ignore msg; there is currently only one supported message ("retry")
506 DoConnect();
507}