TEST_F (SocketAddressTest, Set) { SocketAddress sa; ASSERT_TRUE (sa.SetToLocalhost (AF_INET, 1138)); ASSERT_STREQ ("127.0.0.1", sa.GetIPAddress ().c_str ()); ASSERT_EQ (1138, sa.GetPort ()); ASSERT_TRUE (sa.SetToAnyAddress (AF_INET, 0)); ASSERT_STREQ ("0.0.0.0", sa.GetIPAddress ().c_str ()); ASSERT_EQ (0, sa.GetPort ()); ASSERT_TRUE (sa.SetToLocalhost (AF_INET6, 1139)); ASSERT_STREQ ("::1", sa.GetIPAddress ().c_str ()); ASSERT_EQ (1139, sa.GetPort ()); }
ConnectionStatus ConnectionFileDescriptor::ConnectUDP (const char *host_and_port, Error *error_ptr) { LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_CONNECTION)); if (log) log->Printf ("%p ConnectionFileDescriptor::ConnectUDP (host/port = %s)", this, host_and_port); Disconnect (NULL); m_fd_send_type = m_fd_recv_type = eFDTypeSocketUDP; std::string host_str; std::string port_str; int32_t port = INT32_MIN; if (!DecodeHostAndPort (host_and_port, host_str, port_str, port, error_ptr)) return eConnectionStatusError; // Setup the receiving end of the UDP connection on this localhost // on port zero. After we bind to port zero we can read the port. m_fd_recv = ::socket (AF_INET, SOCK_DGRAM, 0); if (m_fd_recv == -1) { // Socket creation failed... if (error_ptr) error_ptr->SetErrorToErrno(); } else { // Socket was created, now lets bind to the requested port SocketAddress addr; addr.SetToLocalhost (AF_INET, 0); if (::bind (m_fd_recv, addr, addr.GetLength()) == -1) { // Bind failed... if (error_ptr) error_ptr->SetErrorToErrno(); Disconnect (NULL); } } if (m_fd_recv == -1) return eConnectionStatusError; // At this point we have setup the recieve port, now we need to // setup the UDP send socket struct addrinfo hints; struct addrinfo *service_info_list = NULL; ::memset (&hints, 0, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_DGRAM; int err = ::getaddrinfo (host_str.c_str(), port_str.c_str(), &hints, &service_info_list); if (err != 0) { if (error_ptr) error_ptr->SetErrorStringWithFormat("getaddrinfo(%s, %s, &hints, &info) returned error %i (%s)", host_str.c_str(), port_str.c_str(), err, gai_strerror(err)); Disconnect (NULL); return eConnectionStatusError; } for (struct addrinfo *service_info_ptr = service_info_list; service_info_ptr != NULL; service_info_ptr = service_info_ptr->ai_next) { m_fd_send = ::socket (service_info_ptr->ai_family, service_info_ptr->ai_socktype, service_info_ptr->ai_protocol); if (m_fd_send != -1) { m_udp_send_sockaddr = service_info_ptr; break; } else continue; } :: freeaddrinfo (service_info_list); if (m_fd_send == -1) { Disconnect (NULL); return eConnectionStatusError; } if (error_ptr) error_ptr->Clear(); m_should_close_fd = true; return eConnectionStatusSuccess; }
ConnectionStatus ConnectionFileDescriptor::SocketListen (uint16_t listen_port_num, Error *error_ptr) { LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_CONNECTION)); if (log) log->Printf ("%p ConnectionFileDescriptor::SocketListen (port = %i)", this, listen_port_num); Disconnect (NULL); m_fd_send_type = m_fd_recv_type = eFDTypeSocket; int listen_port = ::socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); if (listen_port == -1) { if (error_ptr) error_ptr->SetErrorToErrno(); return eConnectionStatusError; } // enable local address reuse SetSocketOption (listen_port, SOL_SOCKET, SO_REUSEADDR, 1); SocketAddress localhost; if (localhost.SetToLocalhost (AF_INET, listen_port_num)) { int err = ::bind (listen_port, localhost, localhost.GetLength()); if (err == -1) { if (error_ptr) error_ptr->SetErrorToErrno(); Close (listen_port, NULL); return eConnectionStatusError; } err = ::listen (listen_port, 1); if (err == -1) { if (error_ptr) error_ptr->SetErrorToErrno(); Close (listen_port, NULL); return eConnectionStatusError; } m_fd_send = m_fd_recv = ::accept (listen_port, NULL, 0); if (m_fd_send == -1) { if (error_ptr) error_ptr->SetErrorToErrno(); Close (listen_port, NULL); return eConnectionStatusError; } } // We are done with the listen port Close (listen_port, NULL); m_should_close_fd = true; // Keep our TCP packets coming without any delays. SetSocketOption (m_fd_send, IPPROTO_TCP, TCP_NODELAY, 1); if (error_ptr) error_ptr->Clear(); return eConnectionStatusSuccess; }