Revert "Take out listen support from AsyncPacketSocket"
This reverts commit b141c162ee2ef88a7498ba8cb8bc852287f93ad2.
Reason for revert: Breaking WebRTC rolls. See https://ci.chromium.org/ui/b/8832847811929676465 for an example failed build.
Original change's description:
> Take out listen support from AsyncPacketSocket
>
> Moved to new interface class AsyncListenSocket.
>
> Bug: webrtc:13065
> Change-Id: Ib96ce154ba19979360ecd8144981d947ff5b8b18
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/232607
> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
> Reviewed-by: Harald Alvestrand <hta@webrtc.org>
> Commit-Queue: Niels Moller <nisse@webrtc.org>
> Cr-Commit-Position: refs/heads/main@{#35234}
# Not skipping CQ checks because original CL landed > 1 day ago.
Bug: webrtc:13065
Change-Id: Id5d5b35cb21704ca4e3006caf1636906df062609
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/235824
Reviewed-by: Evan Shrubsole <eshr@webrtc.org>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Tommi <tommi@webrtc.org>
Commit-Queue: Evan Shrubsole <eshr@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#35249}
diff --git a/p2p/base/async_stun_tcp_socket.cc b/p2p/base/async_stun_tcp_socket.cc
index 5f8f072..64c19c4 100644
--- a/p2p/base/async_stun_tcp_socket.cc
+++ b/p2p/base/async_stun_tcp_socket.cc
@@ -49,7 +49,7 @@
}
AsyncStunTCPSocket::AsyncStunTCPSocket(rtc::Socket* socket)
- : rtc::AsyncTCPSocketBase(socket, kBufSize) {}
+ : rtc::AsyncTCPSocketBase(socket, /*listen=*/false, kBufSize) {}
int AsyncStunTCPSocket::Send(const void* pv,
size_t cb,
@@ -125,6 +125,10 @@
}
}
+void AsyncStunTCPSocket::HandleIncomingConnection(rtc::Socket* socket) {
+ SignalNewConnection(this, new AsyncStunTCPSocket(socket));
+}
+
size_t AsyncStunTCPSocket::GetExpectedLength(const void* data,
size_t len,
int* pad_bytes) {
diff --git a/p2p/base/async_stun_tcp_socket.h b/p2p/base/async_stun_tcp_socket.h
index eb4eef7..2dc9613 100644
--- a/p2p/base/async_stun_tcp_socket.h
+++ b/p2p/base/async_stun_tcp_socket.h
@@ -36,6 +36,7 @@
size_t cb,
const rtc::PacketOptions& options) override;
void ProcessInput(char* data, size_t* len) override;
+ void HandleIncomingConnection(rtc::Socket* socket) override;
private:
// This method returns the message hdr + length written in the header.
diff --git a/p2p/base/async_stun_tcp_socket_unittest.cc b/p2p/base/async_stun_tcp_socket_unittest.cc
index 72d6a7f..c774b52 100644
--- a/p2p/base/async_stun_tcp_socket_unittest.cc
+++ b/p2p/base/async_stun_tcp_socket_unittest.cc
@@ -16,7 +16,6 @@
#include <list>
#include <memory>
#include <string>
-#include <utility>
#include "absl/memory/memory.h"
#include "rtc_base/network/sent_packet.h"
@@ -60,10 +59,10 @@
static const rtc::SocketAddress kClientAddr("11.11.11.11", 0);
static const rtc::SocketAddress kServerAddr("22.22.22.22", 0);
-class AsyncStunServerTCPSocket : public rtc::AsyncTcpListenSocket {
+class AsyncStunServerTCPSocket : public rtc::AsyncTCPSocket {
public:
- explicit AsyncStunServerTCPSocket(std::unique_ptr<rtc::Socket> socket)
- : AsyncTcpListenSocket(std::move(socket)) {}
+ explicit AsyncStunServerTCPSocket(rtc::Socket* socket)
+ : AsyncTCPSocket(socket, true) {}
void HandleIncomingConnection(rtc::Socket* socket) override {
SignalNewConnection(this, new AsyncStunTCPSocket(socket));
}
@@ -78,11 +77,9 @@
virtual void SetUp() { CreateSockets(); }
void CreateSockets() {
- std::unique_ptr<rtc::Socket> server =
- absl::WrapUnique(vss_->CreateSocket(kServerAddr.family(), SOCK_STREAM));
+ rtc::Socket* server = vss_->CreateSocket(kServerAddr.family(), SOCK_STREAM);
server->Bind(kServerAddr);
- listen_socket_ =
- std::make_unique<AsyncStunServerTCPSocket>(std::move(server));
+ listen_socket_ = std::make_unique<AsyncStunServerTCPSocket>(server);
listen_socket_->SignalNewConnection.connect(
this, &AsyncStunTCPSocketTest::OnNewConnection);
diff --git a/p2p/base/basic_packet_socket_factory.cc b/p2p/base/basic_packet_socket_factory.cc
index e0f21fe..901e3b9 100644
--- a/p2p/base/basic_packet_socket_factory.cc
+++ b/p2p/base/basic_packet_socket_factory.cc
@@ -14,7 +14,6 @@
#include <string>
-#include "absl/memory/memory.h"
#include "api/async_dns_resolver.h"
#include "api/wrapping_async_dns_resolver.h"
#include "p2p/base/async_stun_tcp_socket.h"
@@ -90,7 +89,7 @@
RTC_CHECK(!(opts & PacketSocketFactory::OPT_STUN));
- return new AsyncTcpListenSocket(absl::WrapUnique(socket));
+ return new AsyncTCPSocket(socket, true);
}
AsyncPacketSocket* BasicPacketSocketFactory::CreateClientTcpSocket(
@@ -184,7 +183,7 @@
if (tcp_options.opts & PacketSocketFactory::OPT_STUN) {
tcp_socket = new cricket::AsyncStunTCPSocket(socket);
} else {
- tcp_socket = new AsyncTCPSocket(socket);
+ tcp_socket = new AsyncTCPSocket(socket, false);
}
return tcp_socket;
diff --git a/p2p/base/port_unittest.cc b/p2p/base/port_unittest.cc
index 5bcc186..52153d8 100644
--- a/p2p/base/port_unittest.cc
+++ b/p2p/base/port_unittest.cc
@@ -1060,24 +1060,6 @@
State state_;
};
-class FakeAsyncListenSocket : public AsyncListenSocket {
- public:
- // Returns current local address. Address may be set to NULL if the
- // socket is not bound yet (GetState() returns STATE_BINDING).
- virtual SocketAddress GetLocalAddress() const { return local_address_; }
- void Bind(const SocketAddress& address) {
- local_address_ = address;
- state_ = State::kBound;
- }
- virtual int GetOption(Socket::Option opt, int* value) { return 0; }
- virtual int SetOption(Socket::Option opt, int value) { return 0; }
- virtual State GetState() const { return state_; }
-
- private:
- SocketAddress local_address_;
- State state_ = State::kClosed;
-};
-
// Local -> XXXX
TEST_F(PortTest, TestLocalToLocal) {
TestLocalToLocal();
@@ -1526,8 +1508,8 @@
}
TEST_F(PortTest, TestDisableInterfaceOfTcpPort) {
- FakeAsyncListenSocket* lsocket = new FakeAsyncListenSocket();
- FakeAsyncListenSocket* rsocket = new FakeAsyncListenSocket();
+ FakeAsyncPacketSocket* lsocket = new FakeAsyncPacketSocket();
+ FakeAsyncPacketSocket* rsocket = new FakeAsyncPacketSocket();
FakePacketSocketFactory socket_factory;
socket_factory.set_next_server_tcp_socket(lsocket);
@@ -1536,8 +1518,10 @@
socket_factory.set_next_server_tcp_socket(rsocket);
auto rport = CreateTcpPort(kLocalAddr2, &socket_factory);
- lsocket->Bind(kLocalAddr1);
- rsocket->Bind(kLocalAddr2);
+ lsocket->set_state(AsyncPacketSocket::STATE_BOUND);
+ lsocket->local_address_ = kLocalAddr1;
+ rsocket->set_state(AsyncPacketSocket::STATE_BOUND);
+ rsocket->local_address_ = kLocalAddr2;
lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
lport->SetIceTiebreaker(kTiebreaker1);
@@ -1576,17 +1560,17 @@
SocketAddress("192.168.1.3", 0), SocketAddress("192.168.1.4", 0),
SocketAddress("2001:db8::1", 0), SocketAddress("2001:db8::2", 0)};
for (int i = 0; i < 4; i++) {
+ FakeAsyncPacketSocket* socket = new FakeAsyncPacketSocket();
if (type == SOCK_DGRAM) {
- FakeAsyncPacketSocket* socket = new FakeAsyncPacketSocket();
factory.set_next_udp_socket(socket);
ports[i] = CreateUdpPort(addresses[i], &factory);
socket->set_state(AsyncPacketSocket::STATE_BINDING);
socket->SignalAddressReady(socket, addresses[i]);
} else if (type == SOCK_STREAM) {
- FakeAsyncListenSocket* socket = new FakeAsyncListenSocket();
factory.set_next_server_tcp_socket(socket);
ports[i] = CreateTcpPort(addresses[i], &factory);
- socket->Bind(addresses[i]);
+ socket->set_state(AsyncPacketSocket::STATE_BOUND);
+ socket->local_address_ = addresses[i];
}
ports[i]->PrepareAddress();
}
diff --git a/p2p/base/tcp_port.cc b/p2p/base/tcp_port.cc
index ea805e5..f9dd185 100644
--- a/p2p/base/tcp_port.cc
+++ b/p2p/base/tcp_port.cc
@@ -169,11 +169,13 @@
// Socket may be in the CLOSED state if Listen()
// failed, we still want to add the socket address.
RTC_LOG(LS_VERBOSE) << "Preparing TCP address, current state: "
- << static_cast<int>(listen_socket_->GetState());
- AddAddress(listen_socket_->GetLocalAddress(),
- listen_socket_->GetLocalAddress(), rtc::SocketAddress(),
- TCP_PROTOCOL_NAME, "", TCPTYPE_PASSIVE_STR, LOCAL_PORT_TYPE,
- ICE_TYPE_PREFERENCE_HOST_TCP, 0, "", true);
+ << listen_socket_->GetState();
+ if (listen_socket_->GetState() == rtc::AsyncPacketSocket::STATE_BOUND ||
+ listen_socket_->GetState() == rtc::AsyncPacketSocket::STATE_CLOSED)
+ AddAddress(listen_socket_->GetLocalAddress(),
+ listen_socket_->GetLocalAddress(), rtc::SocketAddress(),
+ TCP_PROTOCOL_NAME, "", TCPTYPE_PASSIVE_STR, LOCAL_PORT_TYPE,
+ ICE_TYPE_PREFERENCE_HOST_TCP, 0, "", true);
} else {
RTC_LOG(LS_INFO) << ToString()
<< ": Not listening due to firewall restrictions.";
diff --git a/rtc_base/async_packet_socket.h b/rtc_base/async_packet_socket.h
index ce36dd6..8362604 100644
--- a/rtc_base/async_packet_socket.h
+++ b/rtc_base/async_packet_socket.h
@@ -128,31 +128,17 @@
// CONNECTED to CLOSED.
sigslot::signal2<AsyncPacketSocket*, int> SignalClose;
+ // Used only for listening TCP sockets.
+ sigslot::signal2<AsyncPacketSocket*, AsyncPacketSocket*> SignalNewConnection;
+
private:
RTC_DISALLOW_COPY_AND_ASSIGN(AsyncPacketSocket);
};
-// Listen socket, producing an AsyncPacketSocket when a peer connects.
-class RTC_EXPORT AsyncListenSocket : public sigslot::has_slots<> {
- public:
- enum class State {
- kClosed,
- kBound,
- };
-
- // Returns current state of the socket.
- virtual State GetState() const = 0;
-
- // Returns current local address. Address may be set to null if the
- // socket is not bound yet (GetState() returns kBinding).
- virtual SocketAddress GetLocalAddress() const = 0;
-
- // Get/set options.
- virtual int GetOption(Socket::Option opt, int* value) = 0;
- virtual int SetOption(Socket::Option opt, int value) = 0;
-
- sigslot::signal2<AsyncListenSocket*, AsyncPacketSocket*> SignalNewConnection;
-};
+// TODO(bugs.webrtc.org/13065): Intended to be broken out into a separate class,
+// after downstream has adapted the new name. The main feature to move from
+// AsyncPacketSocket to AsyncListenSocket is the SignalNewConnection.
+using AsyncListenSocket = AsyncPacketSocket;
void CopySocketInformationToPacketInfo(size_t packet_size_bytes,
const AsyncPacketSocket& socket_from,
diff --git a/rtc_base/async_tcp_socket.cc b/rtc_base/async_tcp_socket.cc
index 37a1052..76efb6d 100644
--- a/rtc_base/async_tcp_socket.cc
+++ b/rtc_base/async_tcp_socket.cc
@@ -62,11 +62,16 @@
}
AsyncTCPSocketBase::AsyncTCPSocketBase(Socket* socket,
+ bool listen,
size_t max_packet_size)
: socket_(socket),
+ listen_(listen),
max_insize_(max_packet_size),
max_outsize_(max_packet_size) {
- inbuf_.EnsureCapacity(kMinimumRecvSize);
+ if (!listen_) {
+ // Listening sockets don't send/receive data, so they don't need buffers.
+ inbuf_.EnsureCapacity(kMinimumRecvSize);
+ }
RTC_DCHECK(socket_.get() != nullptr);
socket_->SignalConnectEvent.connect(this,
@@ -74,6 +79,12 @@
socket_->SignalReadEvent.connect(this, &AsyncTCPSocketBase::OnReadEvent);
socket_->SignalWriteEvent.connect(this, &AsyncTCPSocketBase::OnWriteEvent);
socket_->SignalCloseEvent.connect(this, &AsyncTCPSocketBase::OnCloseEvent);
+
+ if (listen_) {
+ if (socket_->Listen(kListenBacklog) < 0) {
+ RTC_LOG(LS_ERROR) << "Listen() failed with error " << socket_->GetError();
+ }
+ }
}
AsyncTCPSocketBase::~AsyncTCPSocketBase() {}
@@ -95,7 +106,11 @@
case Socket::CS_CLOSED:
return STATE_CLOSED;
case Socket::CS_CONNECTING:
- return STATE_CONNECTING;
+ if (listen_) {
+ return STATE_BOUND;
+ } else {
+ return STATE_CONNECTING;
+ }
case Socket::CS_CONNECTED:
return STATE_CONNECTED;
default:
@@ -134,6 +149,7 @@
}
int AsyncTCPSocketBase::FlushOutBuffer() {
+ RTC_DCHECK(!listen_);
RTC_DCHECK_GT(outbuf_.size(), 0);
rtc::ArrayView<uint8_t> view = outbuf_;
int res;
@@ -173,6 +189,7 @@
void AsyncTCPSocketBase::AppendToOutBuffer(const void* pv, size_t cb) {
RTC_DCHECK(outbuf_.size() + cb <= max_outsize_);
+ RTC_DCHECK(!listen_);
outbuf_.AppendData(static_cast<const uint8_t*>(pv), cb);
}
@@ -183,44 +200,62 @@
void AsyncTCPSocketBase::OnReadEvent(Socket* socket) {
RTC_DCHECK(socket_.get() == socket);
- size_t total_recv = 0;
- while (true) {
- size_t free_size = inbuf_.capacity() - inbuf_.size();
- if (free_size < kMinimumRecvSize && inbuf_.capacity() < max_insize_) {
- inbuf_.EnsureCapacity(std::min(max_insize_, inbuf_.capacity() * 2));
- free_size = inbuf_.capacity() - inbuf_.size();
+ if (listen_) {
+ rtc::SocketAddress address;
+ rtc::Socket* new_socket = socket->Accept(&address);
+ if (!new_socket) {
+ // TODO(stefan): Do something better like forwarding the error
+ // to the user.
+ RTC_LOG(LS_ERROR) << "TCP accept failed with error "
+ << socket_->GetError();
+ return;
}
- int len = socket_->Recv(inbuf_.data() + inbuf_.size(), free_size, nullptr);
- if (len < 0) {
- // TODO(stefan): Do something better like forwarding the error to the
- // user.
- if (!socket_->IsBlocking()) {
- RTC_LOG(LS_ERROR) << "Recv() returned error: " << socket_->GetError();
- }
- break;
- }
+ HandleIncomingConnection(new_socket);
- total_recv += len;
- inbuf_.SetSize(inbuf_.size() + len);
- if (!len || static_cast<size_t>(len) < free_size) {
- break;
- }
- }
-
- if (!total_recv) {
- return;
- }
-
- size_t size = inbuf_.size();
- ProcessInput(inbuf_.data<char>(), &size);
-
- if (size > inbuf_.size()) {
- RTC_LOG(LS_ERROR) << "input buffer overflow";
- RTC_NOTREACHED();
- inbuf_.Clear();
+ // Prime a read event in case data is waiting.
+ new_socket->SignalReadEvent(new_socket);
} else {
- inbuf_.SetSize(size);
+ size_t total_recv = 0;
+ while (true) {
+ size_t free_size = inbuf_.capacity() - inbuf_.size();
+ if (free_size < kMinimumRecvSize && inbuf_.capacity() < max_insize_) {
+ inbuf_.EnsureCapacity(std::min(max_insize_, inbuf_.capacity() * 2));
+ free_size = inbuf_.capacity() - inbuf_.size();
+ }
+
+ int len =
+ socket_->Recv(inbuf_.data() + inbuf_.size(), free_size, nullptr);
+ if (len < 0) {
+ // TODO(stefan): Do something better like forwarding the error to the
+ // user.
+ if (!socket_->IsBlocking()) {
+ RTC_LOG(LS_ERROR) << "Recv() returned error: " << socket_->GetError();
+ }
+ break;
+ }
+
+ total_recv += len;
+ inbuf_.SetSize(inbuf_.size() + len);
+ if (!len || static_cast<size_t>(len) < free_size) {
+ break;
+ }
+ }
+
+ if (!total_recv) {
+ return;
+ }
+
+ size_t size = inbuf_.size();
+ ProcessInput(inbuf_.data<char>(), &size);
+
+ if (size > inbuf_.size()) {
+ RTC_LOG(LS_ERROR) << "input buffer overflow";
+ RTC_NOTREACHED();
+ inbuf_.Clear();
+ } else {
+ inbuf_.SetSize(size);
+ }
}
}
@@ -248,11 +283,12 @@
const SocketAddress& bind_address,
const SocketAddress& remote_address) {
return new AsyncTCPSocket(
- AsyncTCPSocketBase::ConnectSocket(socket, bind_address, remote_address));
+ AsyncTCPSocketBase::ConnectSocket(socket, bind_address, remote_address),
+ false);
}
-AsyncTCPSocket::AsyncTCPSocket(Socket* socket)
- : AsyncTCPSocketBase(socket, kBufSize) {}
+AsyncTCPSocket::AsyncTCPSocket(Socket* socket, bool listen)
+ : AsyncTCPSocketBase(socket, listen, kBufSize) {}
int AsyncTCPSocket::Send(const void* pv,
size_t cb,
@@ -307,59 +343,8 @@
}
}
-AsyncTcpListenSocket::AsyncTcpListenSocket(std::unique_ptr<Socket> socket)
- : socket_(std::move(socket)) {
- RTC_DCHECK(socket_.get() != nullptr);
- socket_->SignalReadEvent.connect(this, &AsyncTcpListenSocket::OnReadEvent);
- if (socket_->Listen(kListenBacklog) < 0) {
- RTC_LOG(LS_ERROR) << "Listen() failed with error " << socket_->GetError();
- }
-}
-
-AsyncTcpListenSocket::State AsyncTcpListenSocket::GetState() const {
- switch (socket_->GetState()) {
- case Socket::CS_CLOSED:
- return State::kClosed;
- case Socket::CS_CONNECTING:
- return State::kBound;
- default:
- RTC_NOTREACHED();
- return State::kClosed;
- }
-}
-
-SocketAddress AsyncTcpListenSocket::GetLocalAddress() const {
- return socket_->GetLocalAddress();
-}
-
-int AsyncTcpListenSocket::GetOption(Socket::Option opt, int* value) {
- return socket_->GetOption(opt, value);
-}
-
-int AsyncTcpListenSocket::SetOption(Socket::Option opt, int value) {
- return socket_->SetOption(opt, value);
-}
-
-void AsyncTcpListenSocket::OnReadEvent(Socket* socket) {
- RTC_DCHECK(socket_.get() == socket);
-
- rtc::SocketAddress address;
- rtc::Socket* new_socket = socket->Accept(&address);
- if (!new_socket) {
- // TODO(stefan): Do something better like forwarding the error
- // to the user.
- RTC_LOG(LS_ERROR) << "TCP accept failed with error " << socket_->GetError();
- return;
- }
-
- HandleIncomingConnection(new_socket);
-
- // Prime a read event in case data is waiting.
- new_socket->SignalReadEvent(new_socket);
-}
-
-void AsyncTcpListenSocket::HandleIncomingConnection(Socket* socket) {
- SignalNewConnection(this, new AsyncTCPSocket(socket));
+void AsyncTCPSocket::HandleIncomingConnection(Socket* socket) {
+ SignalNewConnection(this, new AsyncTCPSocket(socket, false));
}
} // namespace rtc
diff --git a/rtc_base/async_tcp_socket.h b/rtc_base/async_tcp_socket.h
index 901e5cf..ddf9a43 100644
--- a/rtc_base/async_tcp_socket.h
+++ b/rtc_base/async_tcp_socket.h
@@ -28,7 +28,7 @@
// buffer them in user space.
class AsyncTCPSocketBase : public AsyncPacketSocket {
public:
- AsyncTCPSocketBase(Socket* socket, size_t max_packet_size);
+ AsyncTCPSocketBase(Socket* socket, bool listen, size_t max_packet_size);
~AsyncTCPSocketBase() override;
// Pure virtual methods to send and recv data.
@@ -36,6 +36,8 @@
size_t cb,
const rtc::PacketOptions& options) override = 0;
virtual void ProcessInput(char* data, size_t* len) = 0;
+ // Signals incoming connection.
+ virtual void HandleIncomingConnection(Socket* socket) = 0;
SocketAddress GetLocalAddress() const override;
SocketAddress GetRemoteAddress() const override;
@@ -74,6 +76,7 @@
void OnCloseEvent(Socket* socket, int error);
std::unique_ptr<Socket> socket_;
+ bool listen_;
Buffer inbuf_;
Buffer outbuf_;
size_t max_insize_;
@@ -90,37 +93,19 @@
static AsyncTCPSocket* Create(Socket* socket,
const SocketAddress& bind_address,
const SocketAddress& remote_address);
- explicit AsyncTCPSocket(Socket* socket);
+ AsyncTCPSocket(Socket* socket, bool listen);
~AsyncTCPSocket() override {}
int Send(const void* pv,
size_t cb,
const rtc::PacketOptions& options) override;
void ProcessInput(char* data, size_t* len) override;
+ void HandleIncomingConnection(Socket* socket) override;
private:
RTC_DISALLOW_COPY_AND_ASSIGN(AsyncTCPSocket);
};
-class AsyncTcpListenSocket : public AsyncListenSocket {
- public:
- explicit AsyncTcpListenSocket(std::unique_ptr<Socket> socket);
-
- State GetState() const override;
- SocketAddress GetLocalAddress() const override;
-
- int GetOption(Socket::Option opt, int* value) override;
- int SetOption(Socket::Option opt, int value) override;
-
- virtual void HandleIncomingConnection(rtc::Socket* socket);
-
- private:
- // Called by the underlying socket
- void OnReadEvent(Socket* socket);
-
- std::unique_ptr<Socket> socket_;
-};
-
} // namespace rtc
#endif // RTC_BASE_ASYNC_TCP_SOCKET_H_
diff --git a/rtc_base/nat_unittest.cc b/rtc_base/nat_unittest.cc
index 2e41684..4b7a117 100644
--- a/rtc_base/nat_unittest.cc
+++ b/rtc_base/nat_unittest.cc
@@ -56,7 +56,7 @@
}
TestClient* CreateTCPTestClient(Socket* socket) {
- return new TestClient(std::make_unique<AsyncTCPSocket>(socket));
+ return new TestClient(std::make_unique<AsyncTCPSocket>(socket, false));
}
// Tests that when sending from internal_addr to external_addrs through the
diff --git a/rtc_base/test_echo_server.h b/rtc_base/test_echo_server.h
index a061ed0..6fdfc24 100644
--- a/rtc_base/test_echo_server.h
+++ b/rtc_base/test_echo_server.h
@@ -41,7 +41,7 @@
void OnAccept(Socket* socket) {
Socket* raw_socket = socket->Accept(nullptr);
if (raw_socket) {
- AsyncTCPSocket* packet_socket = new AsyncTCPSocket(raw_socket);
+ AsyncTCPSocket* packet_socket = new AsyncTCPSocket(raw_socket, false);
packet_socket->SignalReadPacket.connect(this, &TestEchoServer::OnPacket);
packet_socket->SignalClose.connect(this, &TestEchoServer::OnClose);
client_sockets_.push_back(packet_socket);