Bug #13409
Updated by nobu (Nobuyoshi Nakada) almost 7 years ago
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." ~~~