123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- // Copyright 2013 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef NET_SOCKET_TCP_SOCKET_WIN_H_
- #define NET_SOCKET_TCP_SOCKET_WIN_H_
- #include <stdint.h>
- #include <winsock2.h>
- #include <memory>
- #include "base/memory/raw_ptr.h"
- #include "base/memory/ref_counted.h"
- #include "base/threading/thread_checker.h"
- #include "base/win/object_watcher.h"
- #include "net/base/address_family.h"
- #include "net/base/completion_once_callback.h"
- #include "net/base/net_export.h"
- #include "net/base/network_handle.h"
- #include "net/log/net_log_with_source.h"
- #include "net/socket/socket_descriptor.h"
- #include "net/socket/socket_performance_watcher.h"
- #include "net/traffic_annotation/network_traffic_annotation.h"
- namespace net {
- class AddressList;
- class IOBuffer;
- class IPEndPoint;
- class NetLog;
- struct NetLogSource;
- class SocketTag;
- class NET_EXPORT TCPSocketWin : public base::win::ObjectWatcher::Delegate {
- public:
- TCPSocketWin(
- std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher,
- NetLog* net_log,
- const NetLogSource& source);
- TCPSocketWin(const TCPSocketWin&) = delete;
- TCPSocketWin& operator=(const TCPSocketWin&) = delete;
- ~TCPSocketWin() override;
- int Open(AddressFamily family);
- // Takes ownership of |socket|, which is known to already be connected to the
- // given peer address. However, peer address may be the empty address, for
- // compatibility. The given peer address will be returned by GetPeerAddress.
- int AdoptConnectedSocket(SocketDescriptor socket,
- const IPEndPoint& peer_address);
- // Takes ownership of |socket|, which may or may not be open, bound, or
- // listening. The caller must determine the state of the socket based on its
- // provenance and act accordingly. The socket may have connections waiting
- // to be accepted, but must not be actually connected.
- int AdoptUnconnectedSocket(SocketDescriptor socket);
- int Bind(const IPEndPoint& address);
- int Listen(int backlog);
- int Accept(std::unique_ptr<TCPSocketWin>* socket,
- IPEndPoint* address,
- CompletionOnceCallback callback);
- int Connect(const IPEndPoint& address, CompletionOnceCallback callback);
- bool IsConnected() const;
- bool IsConnectedAndIdle() const;
- // Multiple outstanding requests are not supported.
- // Full duplex mode (reading and writing at the same time) is supported.
- int Read(IOBuffer* buf, int buf_len, CompletionOnceCallback callback);
- int ReadIfReady(IOBuffer* buf, int buf_len, CompletionOnceCallback callback);
- int CancelReadIfReady();
- int Write(IOBuffer* buf,
- int buf_len,
- CompletionOnceCallback callback,
- const NetworkTrafficAnnotationTag& traffic_annotation);
- int GetLocalAddress(IPEndPoint* address) const;
- int GetPeerAddress(IPEndPoint* address) const;
- // Sets various socket options.
- // The commonly used options for server listening sockets:
- // - SetExclusiveAddrUse().
- int SetDefaultOptionsForServer();
- // The commonly used options for client sockets and accepted sockets:
- // - SetNoDelay(true);
- // - SetKeepAlive(true, 45).
- void SetDefaultOptionsForClient();
- int SetExclusiveAddrUse();
- int SetReceiveBufferSize(int32_t size);
- int SetSendBufferSize(int32_t size);
- bool SetKeepAlive(bool enable, int delay);
- bool SetNoDelay(bool no_delay);
- // Gets the estimated RTT. Returns false if the RTT is
- // unavailable. May also return false when estimated RTT is 0.
- [[nodiscard]] bool GetEstimatedRoundTripTime(base::TimeDelta* out_rtt) const;
- void Close();
- bool IsValid() const { return socket_ != INVALID_SOCKET; }
- // Detachs from the current thread, to allow the socket to be transferred to
- // a new thread. Should only be called when the object is no longer used by
- // the old thread.
- void DetachFromThread();
- // Marks the start/end of a series of connect attempts for logging purpose.
- //
- // TCPClientSocket may attempt to connect to multiple addresses until it
- // succeeds in establishing a connection. The corresponding log will have
- // multiple NetLogEventType::TCP_CONNECT_ATTEMPT entries nested within a
- // NetLogEventType::TCP_CONNECT. These methods set the start/end of
- // NetLogEventType::TCP_CONNECT.
- //
- // TODO(yzshen): Change logging format and let TCPClientSocket log the
- // start/end of a series of connect attempts itself.
- void StartLoggingMultipleConnectAttempts(const AddressList& addresses);
- void EndLoggingMultipleConnectAttempts(int net_error);
- const NetLogWithSource& net_log() const { return net_log_; }
- // Return the underlying SocketDescriptor and clean up this object, which may
- // no longer be used. This method should be used only for testing. No read,
- // write, or accept operations should be pending.
- SocketDescriptor ReleaseSocketDescriptorForTesting();
- // Exposes the underlying socket descriptor for testing its state. Does not
- // release ownership of the descriptor.
- SocketDescriptor SocketDescriptorForTesting() const;
- // Apply |tag| to this socket.
- void ApplySocketTag(const SocketTag& tag);
- // Not implemented. Returns ERR_NOT_IMPLEMENTED.
- int BindToNetwork(handles::NetworkHandle network);
- // May return nullptr.
- SocketPerformanceWatcher* socket_performance_watcher() const {
- return socket_performance_watcher_.get();
- }
- private:
- class Core;
- // base::ObjectWatcher::Delegate implementation.
- void OnObjectSignaled(HANDLE object) override;
- int AcceptInternal(std::unique_ptr<TCPSocketWin>* socket,
- IPEndPoint* address);
- int DoConnect();
- void DoConnectComplete(int result);
- void LogConnectBegin(const AddressList& addresses);
- void LogConnectEnd(int net_error);
- void RetryRead(int rv);
- void DidCompleteConnect();
- void DidCompleteWrite();
- void DidSignalRead();
- SOCKET socket_;
- // |socket_performance_watcher_| may be nullptr.
- std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher_;
- HANDLE accept_event_;
- base::win::ObjectWatcher accept_watcher_;
- raw_ptr<std::unique_ptr<TCPSocketWin>> accept_socket_ = nullptr;
- raw_ptr<IPEndPoint> accept_address_ = nullptr;
- CompletionOnceCallback accept_callback_;
- // The various states that the socket could be in.
- bool waiting_connect_ = false;
- bool waiting_read_ = false;
- bool waiting_write_ = false;
- // The core of the socket that can live longer than the socket itself. We pass
- // resources to the Windows async IO functions and we have to make sure that
- // they are not destroyed while the OS still references them.
- scoped_refptr<Core> core_;
- // External callback; called when connect or read is complete.
- CompletionOnceCallback read_callback_;
- // Non-null if a ReadIfReady() is to be completed asynchronously. This is an
- // external callback if user used ReadIfReady() instead of Read(), but a
- // wrapped callback on top of RetryRead() if Read() is used.
- CompletionOnceCallback read_if_ready_callback_;
- // External callback; called when write is complete.
- CompletionOnceCallback write_callback_;
- std::unique_ptr<IPEndPoint> peer_address_;
- // The OS error that a connect attempt last completed with.
- int connect_os_error_ = 0;
- bool logging_multiple_connect_attempts_ = false;
- NetLogWithSource net_log_;
- THREAD_CHECKER(thread_checker_);
- };
- } // namespace net
- #endif // NET_SOCKET_TCP_SOCKET_WIN_H_
|