Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

View cmol's full-sized avatar

Claus Lensbøl cmol

View GitHub Profile
@cmol
cmol / multicast.rb
Last active January 30, 2021 23:12
require 'socket'
require 'ipaddr'
def get_interface_info(name)
ifaddrs = Socket.getifaddrs.reject do |ifaddr|
!ifaddr.addr&.ipv6_linklocal? || (ifaddr.flags & Socket::IFF_MULTICAST == 0)
end
ifaddrs.select! {|ifaddr| ifaddr.name == name } if name
ifaddrs.map {|ifaddr| [ifaddr.name, ifaddr.ifindex, ifaddr.addr.ip_address] }
end
def create_socket(multicast_addr, multicast_port, ifindex)
# Create, bind, and return a UDP multicast socket
UDPSocket.new(Socket::AF_INET6).tap do | s |
ip = IPAddr.new(multicast_addr).hton + [ifindex].pack('I')
s.setsockopt(Socket::IPPROTO_IPV6, Socket::IPV6_JOIN_GROUP, ip)
s.setsockopt(Socket::IPPROTO_IPV6, Socket::IPV6_MULTICAST_HOPS, [1].pack('I'))
s.setsockopt(Socket::IPPROTO_IPV6, Socket::IPV6_MULTICAST_IF, [ifindex].pack('I'))
s.bind("::", multicast_port)
end
end
require "socket"
LISTEN_ADDR = "::"
LISTEN_PORT = 12345
MSG_LENGTH = 256
FLAGS = 0
# Create socket and bind it to the listen on all addresses and the given port
server_socket = UDPSocket.new :INET6
server_socket.bind(LISTEN_ADDR, LISTEN_PORT)
@cmol
cmol / udp_log.rb
Last active October 1, 2020 18:22
addr_info = Addrinfo.new(client)
puts "Client connected from #{addr_info.ip_address} using " +
"#{addr_info.ipv6_v4mapped? ? "IPv4" : "IPv6"}"
def echo_listener(socket, linklocal_addr, multicast_addr, multicast_port,
flags, msg_length)
loop do
# Listen for messages of up to specified length
message, client = socket.recvfrom(msg_length)
# Extract client information given as array and log connection
addr_info = Addrinfo.new(client)
# We are not interested in messages from our selves
def get_interface_info(name)
ifaddrs = Socket.getifaddrs.reject do |ifaddr|
!ifaddr.addr&.ipv6_linklocal? || (ifaddr.flags & Socket::IFF_MULTICAST == 0)
end
ifaddrs.select! {|ifaddr| ifaddr.name == name } if name
ifaddrs.map {|ifaddr| [ifaddr.name, ifaddr.ifindex, ifaddr.addr.ip_address] }
end
message, client = server_socket.recvfrom(MSG_LENGTH)
require "socket"
CONNECT_ADDR = "localhost"
CONNECT_PORT = 12345
MSG_LENGTH = 256
FLAGS = 0
Addrinfo.udp(CONNECT_ADDR, CONNECT_PORT).connect do |socket|
socket.send("Connected via unspecified address family socket", FLAGS)
message, server = socket.recvfrom(MSG_LENGTH)
cmol@qui-gon:~$ ruby echo_client_udp.rb
[IPv6] Connected via unspecified address family socket
cmol@qui-gon:~$ nc -4 -u localhost 12345
Hello from IPv4!
[IPv4] Hello from IPv4!
cmol@qui-gon:~$ nc -6 -u localhost 12345
Hello from IPv6!
[IPv6] Hello from IPv6!