10#define _WINSOCK_DEPRECATED_NO_WARNINGS
15#include "lldb/Host/Config.h"
20#include "llvm/Config/llvm-config.h"
21#include "llvm/Support/Errno.h"
22#include "llvm/Support/Error.h"
23#include "llvm/Support/WindowsError.h"
24#include "llvm/Support/raw_ostream.h"
28#include <netinet/tcp.h>
29#include <sys/socket.h>
39static const int kType = SOCK_STREAM;
56 auto listen_socket_up = std::make_unique<TCPSocket>(
true);
58 return error.takeError();
60 std::string connect_address =
61 llvm::StringRef(listen_socket_up->GetListeningConnectionURI()[0])
65 auto connect_socket_up = std::make_unique<TCPSocket>(
true);
66 if (
Status error = connect_socket_up->Connect(connect_address);
error.Fail())
67 return error.takeError();
72 listen_socket_up->Accept(std::chrono::seconds(1), accept_socket);
74 return error.takeError();
77 std::move(connect_socket_up),
78 std::unique_ptr<TCPSocket>(
static_cast<TCPSocket *
>(accept_socket)));
90 if (::getsockname(
m_socket, sock_addr, &sock_addr_len) == 0)
108 if (::getsockname(
m_socket, sock_addr, &sock_addr_len) == 0)
118 if (::getpeername(
m_socket, sock_addr, &sock_addr_len) == 0)
130 if (::getpeername(
m_socket, sock_addr, &sock_addr_len) == 0)
138 return std::string(llvm::formatv(
145 std::vector<std::string> URIs;
147 URIs.emplace_back(llvm::formatv(
"connection://[{0}]:{1}",
148 addr.GetIPAddress(), addr.GetPort()));
165 LLDB_LOG(log,
"Connect to host/port {0}", name);
172 std::vector<SocketAddress> addresses =
174 AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP);
180 address.SetPort(host_port->port);
184 address.GetLength()) == -1) {
199 "Failed to connect to {0}:{1}", host_port->hostname, host_port->port);
205 LLDB_LOG(log,
"Listen to {0}", name);
212 if (host_port->hostname ==
"*")
213 host_port->hostname =
"0.0.0.0";
215 host_port->hostname.c_str(),
nullptr, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP);
219 if (
error.Fail() || fd < 0)
223 if (
SetOption(fd, SOL_SOCKET, SO_REUSEADDR, 1) == -1) {
232 listen_address.
SetPort(host_port->port);
237 err = ::listen(fd, backlog);
245 if (host_port->port == 0) {
246 socklen_t sa_len = listen_address.
GetLength();
247 if (getsockname(fd, &listen_address.
sockaddr(), &sa_len) == 0)
248 host_port->port = listen_address.
GetPort();
254 assert(
error.Fail());
266llvm::Expected<std::vector<MainLoopBase::ReadHandleUP>>
268 std::function<
void(std::unique_ptr<Socket> socket)> sock_cb) {
270 return llvm::createStringError(
"No open listening sockets!");
272 std::vector<MainLoopBase::ReadHandleUP> handles;
274 auto fd = socket.first;
275 auto io_sp = std::make_shared<TCPSocket>(fd,
false);
289 if (!AddrIn.
IsAnyAddr() && AcceptAddr != AddrIn) {
291 LLDB_LOG(log,
"rejecting incoming connection from {0} (expecting {1})",
295 std::unique_ptr<TCPSocket> sock_up(
new TCPSocket(sock, *
this));
298 sock_up->SetOptionNoDelay();
300 sock_cb(std::move(sock_up));
305 return error.ToError();
312 return SetOption(IPPROTO_TCP, TCP_NODELAY, 1);
316 return SetOption(SOL_SOCKET, SO_REUSEADDR, 1);
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
virtual ReadHandleUP RegisterReadObject(const lldb::IOObjectSP &object_sp, const Callback &callback, Status &error)=0
static std::vector< SocketAddress > GetAddressInfo(const char *hostname, const char *servname, int ai_family, int ai_socktype, int ai_protocol, int ai_flags=0)
bool SetToAnyAddress(sa_family_t family, uint16_t port)
socklen_t GetLength() const
std::string GetIPAddress() const
static socklen_t GetMaxLength()
struct sockaddr & sockaddr()
bool SetPort(uint16_t port)
NativeSocket GetNativeSocket() const
static const NativeSocket kInvalidSocketValue
static NativeSocket CreateSocket(const int domain, const int type, const int protocol, Status &error)
static llvm::Expected< HostAndPort > DecodeHostAndPort(llvm::StringRef host_and_port)
static NativeSocket AcceptSocket(NativeSocket sockfd, struct sockaddr *addr, socklen_t *addrlen, Status &error)
static Status GetLastError()
static int CloseSocket(NativeSocket sockfd)
static int SetOption(NativeSocket sockfd, int level, int option_name, int option_value)
Socket(SocketProtocol protocol, bool should_close)
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
std::vector< std::string > GetListeningConnectionURI() const override
Status Listen(llvm::StringRef name, int backlog) override
bool IsValid() const override
void CloseListenSockets()
uint16_t GetRemotePortNumber() const
Status CreateSocket(int domain)
std::string GetRemoteConnectionURI() const override
llvm::Expected< std::vector< MainLoopBase::ReadHandleUP > > Accept(MainLoopBase &loop, std::function< void(std::unique_ptr< Socket > socket)> sock_cb) override
std::string GetLocalIPAddress() const
std::string GetRemoteIPAddress() const
uint16_t GetLocalPortNumber() const
int SetOptionReuseAddress()
TCPSocket(bool should_close)
static llvm::Expected< Pair > CreatePair()
std::map< int, SocketAddress > m_listen_sockets
std::pair< std::unique_ptr< TCPSocket >, std::unique_ptr< TCPSocket > > Pair
Status Connect(llvm::StringRef name) override
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.