summaryrefslogtreecommitdiffstats
path: root/net/socket
diff options
context:
space:
mode:
authorxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-29 10:24:35 +0000
committerxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-29 10:24:35 +0000
commitef2f002744fa3b40f0da96b959b5defa0dd2f565 (patch)
tree24d0e4f30c84811887d0877156a3cca98bc33854 /net/socket
parent3c05331313cf4d8569b656ced2e09ed2ed3cdbb4 (diff)
downloadchromium_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.cc55
-rw-r--r--net/socket/tcp_socket_win.cc18
-rw-r--r--net/socket/tcp_socket_win.h7
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);