From: samuel@... Date: 2017-04-10T01:10:41+00:00 Subject: [ruby-core:80631] [Ruby trunk Bug#13409] UDPSocket#send breaks when using sockaddr Issue #13409 has been updated by ioquatix (Samuel Williams). ~~~ % uname -a Linux koyoko.local 4.10.4-1-ARCH #1 SMP PREEMPT Sat Mar 18 19:39:18 CET 2017 x86_64 GNU/Linux ~~~ ~~~ % ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eno1: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 74:d0:2b:7b:dd:77 brd ff:ff:ff:ff:ff:ff inet 192.168.1.23/24 brd 192.168.1.255 scope global dynamic eno1 valid_lft 383sec preferred_lft 383sec inet6 2406:e007:aed:0:76d0:2bff:fe7b:dd77/64 scope global noprefixroute dynamic valid_lft 2591868sec preferred_lft 604668sec inet6 fe80::76d0:2bff:fe7b:dd77/64 scope link valid_lft forever preferred_lft forever ~~~ I use IPv6 all the time and it works fine. ---------------------------------------- Bug #13409: UDPSocket#send breaks when using sockaddr https://bugs.ruby-lang.org/issues/13409#change-64141 * Author: ioquatix (Samuel Williams) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: 2.4.0 * Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- Here is the working example. ~~~ruby #!/usr/bin/env ruby require 'socket' port = 6778 server = UDPSocket.new.tap{|socket| socket.bind("localhost", port)} client = UDPSocket.new data = "Matz is nice so we are nice." t1 = Thread.new do packet, (_, remote_port, remote_host) = server.recvfrom(512) server.send(packet, 0, remote_host, remote_port) end t2 = Thread.new do client.send(data, 0, "localhost", port) response, _ = client.recvfrom(512) puts "Got response: #{response.inspect}" end [t1, t2].each(&:join) puts "Finished." ~~~ Here is one that fails with EINVAL: ~~~ruby #!/usr/bin/env ruby Thread.abort_on_exception = true require 'socket' port = 6778 server = UDPSocket.new.tap{|socket| socket.bind("localhost", port)} client = UDPSocket.new data = "Matz is nice so we are nice." t1 = Thread.new do puts "Server waiting for packet..." packet, (_, remote_port, remote_host) = server.recvfrom(512) server.send(packet, 0, remote_host, remote_port) end t2 = Thread.new do address = Addrinfo.udp("localhost", port) puts "Sending data to #{address.inspect}" # Should call ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen), but calls send which fails with EINVAL. result = client.send(data, 0, address.to_sockaddr) response, _ = client.recvfrom(512) puts "Got response: #{response.inspect}" end [t1, t2].each(&:join) puts "Finished." ~~~ -- https://bugs.ruby-lang.org/ Unsubscribe: