Sha256: cd91e96ae4ae4ba936ba5c55026d1f2fa1acc581789f33e323bc894b28b1e485

Contents?: true

Size: 1.12 KB

Versions: 2

Compression:

Stored size: 1.12 KB

Contents

require 'socket'
require 'ipaddr'

module RUPNP
  module SSDP

    # Base class for multicast connections (mainly SSDP search and listen)
    # @abstract
    class MulticastConnection < EM::Connection
      include LogMixin

      # @param [Integer] ttl
      def initialize(ttl=nil)
        @ttl = ttl || DEFAULT_TTL
        setup_multicast_socket
      end

      # Get peer info
      # @return [Array] [port, hostname]
      def peer_info
        Socket.unpack_sockaddr_in(get_peername)
      end


      private

      def setup_multicast_socket
        set_membership(IPAddr.new(MULTICAST_IP).hton +
                       IPAddr.new('0.0.0.0').hton)
        set_ttl
        set_reuse_addr
      end

      def set_membership(value)
        set_sock_opt Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, value
      end

      def set_ttl
        value = [@ttl].pack('i')
        set_sock_opt Socket::IPPROTO_IP, Socket::IP_MULTICAST_TTL, value
        set_sock_opt Socket::IPPROTO_IP, Socket::IP_TTL, value
      end

      def set_reuse_addr
        set_sock_opt Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true
      end

    end

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rupnp-0.3.0 lib/rupnp/ssdp/multicast_connection.rb
rupnp-0.2.2 lib/rupnp/ssdp/multicast_connection.rb