Skip to content

Instantly share code, notes, and snippets.

View cmol's full-sized avatar

Claus Lensbøl cmol

View GitHub Profile
@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"}"
irb(main):003:0> Socket.getaddrinfo("localhost", 12345, :AF_UNSPEC, :DGRAM)
=> [
["AF_INET6", 12345, "::1", "::1", 10, 2, 17],
["AF_INET", 12345, "127.0.0.1", "127.0.0.1", 2, 2, 17]
]
Socket.getaddrinfo(CONNECT_ADDR,CONNECT_PORT, :AF_UNSPEC, :DGRAM).each do | con |
af, port, hostname, ip, pf, sock_type, ipproto = con
Addrinfo.udp(ip, port).connect do |socket|
socket.send("Connected via #{af}", FLAGS)
message, server = socket.recvfrom(MSG_LENGTH)
puts message
end
end
cmol@qui-gon:~$ ruby echo_client_udp.rb
[IPv6] Connected via unspecified address family socket
[IPv6] Connected via AF_INET6
[IPv4] Connected via AF_INET
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)
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 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
[["if_name", index, "ip_address"],[...]]
@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
cmol@third-host:~$ ruby src/multicast.rb
Using local interface enp0s3 with address fe80::a00:27ff:fe07:dea6%enp0s3
========= Sending echo REQUEST from fe80::a00:27ff:fe07:dea6%enp0s3
[REPLY] Hello from fe80::71c0:aa40:6d16:7c59%wlp4s0
[REPLY] Hello from fe80::ade4:80af:c170:6340%enp0s31f6