diff options
author | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-29 10:24:35 +0000 |
---|---|---|
committer | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-29 10:24:35 +0000 |
commit | ef2f002744fa3b40f0da96b959b5defa0dd2f565 (patch) | |
tree | 24d0e4f30c84811887d0877156a3cca98bc33854 /net/socket | |
parent | 3c05331313cf4d8569b656ced2e09ed2ed3cdbb4 (diff) | |
download | chromium_src-ef2f002744fa3b40f0da96b959b5defa0dd2f565.zip chromium_src-ef2f002744fa3b40f0da96b959b5defa0dd2f565.tar.gz chromium_src-ef2f002744fa3b40f0da96b959b5defa0dd2f565.tar.bz2 |
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
Diffstat (limited to 'net/socket')
-rw-r--r-- | net/socket/tcp_socket_unittest.cc | 55 | ||||
-rw-r--r-- | net/socket/tcp_socket_win.cc | 18 | ||||
-rw-r--r-- | net/socket/tcp_socket_win.h | 7 |
3 files changed, 63 insertions, 17 deletions
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<TCPSocket> 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<TCPSocket> 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); |