From ef2f002744fa3b40f0da96b959b5defa0dd2f565 Mon Sep 17 00:00:00 2001 From: "xiyuan@chromium.org" Date: Tue, 29 Apr 2014 10:24:35 +0000 Subject: win: Implement Bluetooth server. BUG=333979 Review URL: https://codereview.chromium.org/236203018 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@266831 0039d316-1c4b-4281-b951-d872f2087c98 --- net/socket/tcp_socket_unittest.cc | 55 +++++++++++++++++++++++++++------------ net/socket/tcp_socket_win.cc | 18 +++++++++++++ net/socket/tcp_socket_win.h | 7 ++++- 3 files changed, 63 insertions(+), 17 deletions(-) (limited to 'net/socket') diff --git a/net/socket/tcp_socket_unittest.cc b/net/socket/tcp_socket_unittest.cc index a45fcba..1981388 100644 --- a/net/socket/tcp_socket_unittest.cc +++ b/net/socket/tcp_socket_unittest.cc @@ -64,6 +64,28 @@ class TCPSocketTest : public PlatformTest { *address = IPEndPoint(ip_number, port); } + void TestAcceptAsync() { + TestCompletionCallback accept_callback; + scoped_ptr accepted_socket; + IPEndPoint accepted_address; + ASSERT_EQ(ERR_IO_PENDING, + socket_.Accept(&accepted_socket, &accepted_address, + accept_callback.callback())); + + TestCompletionCallback connect_callback; + TCPClientSocket connecting_socket(local_address_list(), + NULL, NetLog::Source()); + connecting_socket.Connect(connect_callback.callback()); + + EXPECT_EQ(OK, connect_callback.WaitForResult()); + EXPECT_EQ(OK, accept_callback.WaitForResult()); + + EXPECT_TRUE(accepted_socket.get()); + + // Both sockets should be on the loopback network interface. + EXPECT_EQ(accepted_address.address(), local_address_.address()); + } + AddressList local_address_list() const { return AddressList(local_address_); } @@ -103,27 +125,28 @@ TEST_F(TCPSocketTest, Accept) { // Test Accept() callback. TEST_F(TCPSocketTest, AcceptAsync) { ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); + TestAcceptAsync(); +} - TestCompletionCallback accept_callback; - scoped_ptr accepted_socket; - IPEndPoint accepted_address; - ASSERT_EQ(ERR_IO_PENDING, - socket_.Accept(&accepted_socket, &accepted_address, - accept_callback.callback())); +#if defined(OS_WIN) +// Test Accept() for AdoptListenSocket. +TEST_F(TCPSocketTest, AcceptForAdoptedListenSocket) { + // Create a socket to be used with AdoptListenSocket. + SOCKET existing_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + ASSERT_EQ(OK, socket_.AdoptListenSocket(existing_socket)); - TestCompletionCallback connect_callback; - TCPClientSocket connecting_socket(local_address_list(), - NULL, NetLog::Source()); - connecting_socket.Connect(connect_callback.callback()); + IPEndPoint address; + ParseAddress("127.0.0.1", 0, &address); + SockaddrStorage storage; + ASSERT_TRUE(address.ToSockAddr(storage.addr, &storage.addr_len)); + ASSERT_EQ(0, bind(existing_socket, storage.addr, storage.addr_len)); - EXPECT_EQ(OK, connect_callback.WaitForResult()); - EXPECT_EQ(OK, accept_callback.WaitForResult()); + ASSERT_EQ(OK, socket_.Listen(kListenBacklog)); + ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); - EXPECT_TRUE(accepted_socket.get()); - - // Both sockets should be on the loopback network interface. - EXPECT_EQ(accepted_address.address(), local_address_.address()); + TestAcceptAsync(); } +#endif // Accept two connections simultaneously. TEST_F(TCPSocketTest, Accept2Connections) { diff --git a/net/socket/tcp_socket_win.cc b/net/socket/tcp_socket_win.cc index 0d1192d..4667bd8 100644 --- a/net/socket/tcp_socket_win.cc +++ b/net/socket/tcp_socket_win.cc @@ -322,6 +322,24 @@ int TCPSocketWin::AdoptConnectedSocket(SOCKET socket, return OK; } +int TCPSocketWin::AdoptListenSocket(SOCKET socket) { + DCHECK(CalledOnValidThread()); + DCHECK_EQ(socket_, INVALID_SOCKET); + + socket_ = socket; + + if (SetNonBlocking(socket_)) { + int result = MapSystemError(WSAGetLastError()); + Close(); + return result; + } + + // |core_| is not needed for sockets that are used to accept connections. + // The operation here is more like Open but with an existing socket. + + return OK; +} + int TCPSocketWin::Bind(const IPEndPoint& address) { DCHECK(CalledOnValidThread()); DCHECK_NE(socket_, INVALID_SOCKET); diff --git a/net/socket/tcp_socket_win.h b/net/socket/tcp_socket_win.h index f886d33..2ddd538 100644 --- a/net/socket/tcp_socket_win.h +++ b/net/socket/tcp_socket_win.h @@ -31,8 +31,13 @@ class NET_EXPORT TCPSocketWin : NON_EXPORTED_BASE(public base::NonThreadSafe), virtual ~TCPSocketWin(); int Open(AddressFamily family); - // Takes ownership of |socket|. + + // Both AdoptConnectedSocket and AdoptListenSocket take ownership of an + // existing socket. AdoptConnectedSocket takes an already connected + // socket. AdoptListenSocket takes a socket that is intended to accept + // connection. In some sense, AdoptListenSocket is more similar to Open. int AdoptConnectedSocket(SOCKET socket, const IPEndPoint& peer_address); + int AdoptListenSocket(SOCKET socket); int Bind(const IPEndPoint& address); -- cgit v1.1