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/WindowsError.h"
23 #include "llvm/Support/raw_ostream.h"
26 #include <arpa/inet.h>
27 #include <netinet/tcp.h>
28 #include <sys/socket.h>
36 #define CLOSE_SOCKET closesocket
40 #define CLOSE_SOCKET ::close
50 EC = llvm::mapWindowsError(WSAGetLastError());
52 EC = std::error_code(errno, std::generic_category());
57 static const int kType = SOCK_STREAM;
59 TCPSocket::TCPSocket(
bool should_close,
bool child_processes_inherit)
60 :
Socket(ProtocolTcp, should_close, child_processes_inherit) {}
63 :
Socket(ProtocolTcp, listen_socket.m_should_close_fd,
64 listen_socket.m_child_processes_inherit) {
69 bool child_processes_inherit)
70 :
Socket(ProtocolTcp, should_close, child_processes_inherit) {
85 if (::getsockname(
m_socket, sock_addr, &sock_addr_len) == 0)
103 if (::getsockname(
m_socket, sock_addr, &sock_addr_len) == 0)
113 if (::getpeername(
m_socket, sock_addr, &sock_addr_len) == 0)
125 if (::getpeername(
m_socket, sock_addr, &sock_addr_len) == 0)
153 LLDB_LOGF(log,
"TCPSocket::%s (host/port = %s)", __FUNCTION__, name.data());
158 return Status(host_port.takeError());
160 std::vector<SocketAddress> addresses =
162 AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP);
168 address.SetPort(host_port->port);
170 if (-1 == llvm::sys::RetryAfterSignal(-1, ::connect,
GetNativeSocket(),
172 address.GetLength())) {
183 error.SetErrorString(
"Failed to connect port");
189 LLDB_LOGF(log,
"TCPSocket::%s (%s)", __FUNCTION__, name.data());
194 return Status(host_port.takeError());
196 if (host_port->hostname ==
"*")
197 host_port->hostname =
"0.0.0.0";
199 host_port->hostname.c_str(),
nullptr, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP);
207 int option_value = 1;
210 ::setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, option_value_p,
211 sizeof(option_value));
217 listen_address.
SetPort(host_port->port);
222 err = ::listen(fd, backlog);
230 if (host_port->port == 0) {
231 socklen_t sa_len = address.GetLength();
232 if (getsockname(fd, &address.sockaddr(), &sa_len) == 0)
233 host_port->port = address.GetPort();
239 assert(
error.Fail());
254 error.SetErrorString(
"No open listening sockets!");
259 int listen_sock = -1;
262 std::vector<MainLoopBase::ReadHandleUP> handles;
264 auto fd = socket.first;
266 auto io_sp = IOObjectSP(
new TCPSocket(socket.first,
false, inherit));
268 io_sp, [fd, inherit, &sock, &AcceptAddr, &
error,
270 socklen_t sa_len = AcceptAddr.GetMaxLength();
271 sock = AcceptSocket(fd, &AcceptAddr.sockaddr(), &sa_len, inherit,
274 loop.RequestTermination();
280 bool accept_connection =
false;
281 std::unique_ptr<TCPSocket> accepted_socket;
283 while (!accept_connection) {
290 if (!AddrIn.
IsAnyAddr() && AcceptAddr != AddrIn) {
292 llvm::errs() << llvm::formatv(
293 "error: rejecting incoming connection from {0} (expecting {1})",
297 accept_connection =
true;
298 accepted_socket.reset(
new TCPSocket(sock, *
this));
301 if (!accepted_socket)
305 accepted_socket->SetOptionNoDelay();
307 conn_socket = accepted_socket.release();
312 return SetOption(IPPROTO_TCP, TCP_NODELAY, 1);
316 return SetOption(SOL_SOCKET, SO_REUSEADDR, 1);