/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include <sys/types.h> #include <chrono> #include <map> #include <memory> #include <folly/ConstructorCallbackList.h> #include <folly/Optional.h> #include <folly/SocketAddress.h> #include <folly/detail/SocketFastOpen.h> #include <folly/io/IOBuf.h> #include <folly/io/IOBufIovecBuilder.h> #include <folly/io/ShutdownSocketSet.h> #include <folly/io/SocketOptionMap.h> #include <folly/io/async/AsyncSocketException.h> #include <folly/io/async/AsyncSocketTransport.h> #include <folly/io/async/AsyncTimeout.h> #include <folly/io/async/AsyncTransport.h> #include <folly/io/async/DelayedDestruction.h> #include <folly/io/async/EventHandler.h> #include <folly/io/async/observer/AsyncSocketObserverContainer.h> #include <folly/net/NetOpsDispatcher.h> #include <folly/net/TcpInfo.h> #include <folly/net/TcpInfoDispatcher.h> #include <folly/portability/Sockets.h> #include <folly/small_vector.h> namespace folly { /** * A class for performing asynchronous I/O on a socket. * * AsyncSocket allows users to asynchronously wait for data on a socket, and * to asynchronously send data. * * The APIs for reading and writing are intentionally asymmetric. Waiting for * data to read is a persistent API: a callback is installed, and is notified * whenever new data is available. It continues to be notified of new events * until it is uninstalled. * * AsyncSocket does not provide read timeout functionality, because it * typically cannot determine when the timeout should be active. Generally, a * timeout should only be enabled when processing is blocked waiting on data * from the remote endpoint. For server sockets, the timeout should not be * active if the server is currently processing one or more outstanding * requests for this socket. For client sockets, the timeout should not be * active if there are no requests pending on the socket. Additionally, if a * client has multiple pending requests, it will usually want a separate * timeout for each request, rather than a single read timeout. * * The write API is fairly intuitive: a user can request to send a block of * data, and a callback will be informed once the entire block has been * transferred to the kernel, or on error. AsyncSocket does provide a send * timeout, since most callers want to give up if the remote end stops * responding and no further progress can be made sending the data. */ #if defined __linux__ && !defined SO_NO_TRANSPARENT_TLS #define SO_NO_TRANSPARENT_TLS … #endif #if defined __linux__ && !defined SO_NO_TSOCKS #define SO_NO_TSOCKS … #endif #if FOLLY_HAVE_SO_TIMESTAMPING #define SO_MAX_ATTEMPTS_ENABLE_BYTEEVENTS … #endif class AsyncSocket : public AsyncSocketTransport { … }; std::ostream& operator<<( std::ostream& os, const folly::AsyncSocket::WriteRequestTag& tag); } // namespace folly template <> struct std::hash<folly::AsyncSocket::WriteRequestTag> { … };