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;
44 :
Socket(ProtocolTcp, listen_socket.m_should_close_fd) {
49 :
Socket(ProtocolTcp, should_close) {
64 if (::getsockname(
m_socket, sock_addr, &sock_addr_len) == 0)
82 if (::getsockname(
m_socket, sock_addr, &sock_addr_len) == 0)
92 if (::getpeername(
m_socket, sock_addr, &sock_addr_len) == 0)
104 if (::getpeername(
m_socket, sock_addr, &sock_addr_len) == 0)
112 return std::string(llvm::formatv(
119 std::vector<std::string> URIs;
121 URIs.emplace_back(llvm::formatv(
"connection://[{0}]:{1}",
122 addr.GetIPAddress(), addr.GetPort()));
139 LLDB_LOG(log,
"Connect to host/port {0}", name);
146 std::vector<SocketAddress> addresses =
148 AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP);
154 address.SetPort(host_port->port);
158 address.GetLength()) == -1) {
178 LLDB_LOG(log,
"Listen to {0}", name);
185 if (host_port->hostname ==
"*")
186 host_port->hostname =
"0.0.0.0";
188 host_port->hostname.c_str(),
nullptr, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP);
192 if (
error.Fail() || fd < 0)
196 if (
SetOption(fd, SOL_SOCKET, SO_REUSEADDR, 1) == -1) {
205 listen_address.
SetPort(host_port->port);
210 err = ::listen(fd, backlog);
218 if (host_port->port == 0) {
219 socklen_t sa_len = listen_address.
GetLength();
220 if (getsockname(fd, &listen_address.
sockaddr(), &sa_len) == 0)
221 host_port->port = listen_address.
GetPort();
227 assert(
error.Fail());
239llvm::Expected<std::vector<MainLoopBase::ReadHandleUP>>
241 std::function<
void(std::unique_ptr<Socket> socket)> sock_cb) {
243 return llvm::createStringError(
"No open listening sockets!");
245 std::vector<MainLoopBase::ReadHandleUP> handles;
247 auto fd = socket.first;
248 auto io_sp = std::make_shared<TCPSocket>(fd,
false);
262 if (!AddrIn.
IsAnyAddr() && AcceptAddr != AddrIn) {
264 LLDB_LOG(log,
"rejecting incoming connection from {0} (expecting {1})",
268 std::unique_ptr<TCPSocket> sock_up(
new TCPSocket(sock, *
this));
271 sock_up->SetOptionNoDelay();
273 sock_cb(std::move(sock_up));
278 return error.ToError();
285 return SetOption(IPPROTO_TCP, TCP_NODELAY, 1);
289 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)
static Status FromErrorString(const char *str)
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)
std::map< int, SocketAddress > m_listen_sockets
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.