| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "net/dial/dial_udp_socket_factory.h" |
| |
| #if !defined(OS_STARBOARD) |
| #include <arpa/inet.h> |
| #endif |
| |
| #include "base/logging.h" |
| #include "net/base/ip_endpoint.h" |
| #include "net/base/net_string_util.h" |
| |
| #if defined(OS_STARBOARD) |
| #include "starboard/common/socket.h" |
| #include "starboard/types.h" |
| #endif |
| |
| namespace net { |
| |
| std::unique_ptr<UDPSocket> UdpSocketFactory::CreateAndBind( |
| const IPEndPoint& address) { |
| std::unique_ptr<UDPSocket> sock( |
| new UDPSocket(DatagramSocket::DEFAULT_BIND, nullptr, NetLogSource())); |
| if (sock->Open(address.GetFamily()) != net::OK) { |
| return NULL; |
| } |
| |
| int set_socket_reuse_success = sock->AllowAddressReuse(); |
| if (set_socket_reuse_success != OK) { |
| LOG(WARNING) << "AllowAddressReuse failed on DIAL UDP socket with code " |
| << set_socket_reuse_success; |
| } |
| |
| if (sock->Bind(address) != net::OK) { |
| LOG(WARNING) << "DIAL UDP socket failed to bind to address"; |
| sock->Close(); |
| return NULL; |
| } |
| |
| SetupSocketAfterBind(sock.get()); |
| |
| return sock; |
| } |
| // Enable Multicast and join group if multicast is enabled. |
| void DialUdpSocketFactory::SetupSocketAfterBind(UDPSocket* sock) { |
| net::IPAddress address(239, 255, 255, 250); |
| if (sock->JoinGroup(address) != net::OK) { |
| LOG(WARNING) << "JoinGroup failed on DIAL UDP socket."; |
| } |
| } |
| |
| } // namespace net |