// Copyright 2011 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_SOCKET_UDP_CLIENT_SOCKET_H_ #define NET_SOCKET_UDP_CLIENT_SOCKET_H_ #include #include "net/base/net_export.h" #include "net/socket/datagram_client_socket.h" #include "net/socket/socket_descriptor.h" #include "net/socket/udp_socket.h" #include "net/traffic_annotation/network_traffic_annotation.h" namespace net { class NetLog; struct NetLogSource; // A client socket that uses UDP as the transport layer. class NET_EXPORT_PRIVATE UDPClientSocket : public DatagramClientSocket { public: // If `network` is specified, the socket will be bound to it. All data traffic // on the socket will be sent and received via `network`. Communication using // this socket will fail if `network` disconnects. UDPClientSocket( DatagramSocket::BindType bind_type, net::NetLog* net_log, const net::NetLogSource& source, handles::NetworkHandle network = handles::kInvalidNetworkHandle); UDPClientSocket( DatagramSocket::BindType bind_type, NetLogWithSource source_net_log, handles::NetworkHandle network = handles::kInvalidNetworkHandle); UDPClientSocket(const UDPClientSocket&) = delete; UDPClientSocket& operator=(const UDPClientSocket&) = delete; ~UDPClientSocket() override; // DatagramClientSocket implementation. int Connect(const IPEndPoint& address) override; int ConnectUsingNetwork(handles::NetworkHandle network, const IPEndPoint& address) override; int ConnectUsingDefaultNetwork(const IPEndPoint& address) override; int ConnectAsync(const IPEndPoint& address, CompletionOnceCallback callback) override; int ConnectUsingNetworkAsync(handles::NetworkHandle network, const IPEndPoint& address, CompletionOnceCallback callback) override; int ConnectUsingDefaultNetworkAsync(const IPEndPoint& address, CompletionOnceCallback callback) override; handles::NetworkHandle GetBoundNetwork() const override; void ApplySocketTag(const SocketTag& tag) override; int Read(IOBuffer* buf, int buf_len, CompletionOnceCallback callback) override; int Write(IOBuffer* buf, int buf_len, CompletionOnceCallback callback, const NetworkTrafficAnnotationTag& traffic_annotation) override; void Close() override; int GetPeerAddress(IPEndPoint* address) const override; int GetLocalAddress(IPEndPoint* address) const override; // Switch to use non-blocking IO. Must be called right after construction and // before other calls. void UseNonBlockingIO() override; int SetReceiveBufferSize(int32_t size) override; int SetSendBufferSize(int32_t size) override; int SetDoNotFragment() override; int SetRecvEcn() override; void SetMsgConfirm(bool confirm) override; const NetLogWithSource& NetLog() const override; void EnableRecvOptimization() override; int SetMulticastInterface(uint32_t interface_index) override; void SetIOSNetworkServiceType(int ios_network_service_type) override; // Takes ownership of an opened but unconnected and unbound `socket`. This // method must be called after UseNonBlockingIO, otherwise the adopted socket // will not have the non-blocking IO flag set. int AdoptOpenedSocket(AddressFamily address_family, SocketDescriptor socket); uint32_t get_multicast_interface_for_testing() { return socket_.get_multicast_interface_for_testing(); } #if !BUILDFLAG(IS_WIN) bool get_msg_confirm_for_testing() { return socket_.get_msg_confirm_for_testing(); } bool get_recv_optimization_for_testing() { return socket_.get_experimental_recv_optimization_enabled_for_testing(); } #endif #if BUILDFLAG(IS_WIN) bool get_use_non_blocking_io_for_testing() { return socket_.get_use_non_blocking_io_for_testing(); } #endif private: NetLogWithSource net_log_; UDPSocket socket_; bool adopted_opened_socket_ = false; bool connect_called_ = false; // The network the socket is currently bound to. handles::NetworkHandle network_ = handles::kInvalidNetworkHandle; handles::NetworkHandle connect_using_network_; }; } // namespace net #endif // NET_SOCKET_UDP_CLIENT_SOCKET_H_