1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef NET_SOCKET_TCP_LISTEN_SOCKET_H_
6#define NET_SOCKET_TCP_LISTEN_SOCKET_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "net/base/net_export.h"
12#include "net/socket/socket_descriptor.h"
13#include "net/socket/stream_listen_socket.h"
14
15namespace net {
16
17// Implements a TCP socket.
18class NET_EXPORT TCPListenSocket : public StreamListenSocket {
19 public:
20  virtual ~TCPListenSocket();
21  // Listen on port for the specified IP address.  Use 127.0.0.1 to only
22  // accept local connections.
23  static scoped_ptr<TCPListenSocket> CreateAndListen(
24      const std::string& ip, int port, StreamListenSocket::Delegate* del);
25
26  // Get raw TCP socket descriptor bound to ip:port.
27  static SocketDescriptor CreateAndBind(const std::string& ip, int port);
28
29  // Get raw TCP socket descriptor bound to ip and return port it is bound to.
30  static SocketDescriptor CreateAndBindAnyPort(const std::string& ip,
31                                               int* port);
32
33 protected:
34  TCPListenSocket(SocketDescriptor s, StreamListenSocket::Delegate* del);
35
36  // Implements StreamListenSocket::Accept.
37  virtual void Accept() OVERRIDE;
38
39 private:
40  DISALLOW_COPY_AND_ASSIGN(TCPListenSocket);
41};
42
43// Factory that can be used to instantiate TCPListenSocket.
44class NET_EXPORT TCPListenSocketFactory : public StreamListenSocketFactory {
45 public:
46  TCPListenSocketFactory(const std::string& ip, int port);
47  virtual ~TCPListenSocketFactory();
48
49  // StreamListenSocketFactory overrides.
50  virtual scoped_ptr<StreamListenSocket> CreateAndListen(
51      StreamListenSocket::Delegate* delegate) const OVERRIDE;
52
53 private:
54  const std::string ip_;
55  const int port_;
56
57  DISALLOW_COPY_AND_ASSIGN(TCPListenSocketFactory);
58};
59
60}  // namespace net
61
62#endif  // NET_SOCKET_TCP_LISTEN_SOCKET_H_
63