Project

General

Profile

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." 
 ~~~ 

Back