Actions
Bug #13409
closedUDPSocket#send breaks when using sockaddr
Description
Here is the working example.
#!/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:
#!/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."
Actions
Like0
Like0Like0Like0Like0Like0Like0Like0