lib/prologix_gpib/discovery.rb in prologix_gpib-0.5.0 vs lib/prologix_gpib/discovery.rb in prologix_gpib-0.5.2

- old
+ new

@@ -58,20 +58,19 @@ ip_addr :netmask string :ip_gw, read_length: 4 string :app_ver, read_length: 4 string :boot_ver, read_length: 4 string :hw_ver, read_length: 4 - stringz :name end NF_MAGIC = 0x5a HEADER_FMT = 'CCna8' NF_IDENTIFY = 0 NF_IDENTIFY_REPLY = 1 BROADCAST_PORT = 3040 BROADCAST_ADDRESS = '255.255.255.255' - TIMEOUT = 1 + TIMEOUT = 0.5 private def lan_device_ips seq = rand(0..65_535) @@ -88,19 +87,28 @@ data.seq = seq data.eth_addr = 'FF:FF:FF:FF:FF:FF' sock.send(data.to_binary_s, 0, BROADCAST_ADDRESS, BROADCAST_PORT) array = [] + replies = [] begin Timeout.timeout(TIMEOUT) do while true - data, addr = sock.recvfrom(256) - reply = NFIdentifyReply.read(data) - next if array.include?(reply.addr) - array << reply.addr if reply.header.seq == seq && reply.header.identify == NF_IDENTIFY_REPLY + data, addr = sock.recvfrom(1000) + replies << data end end rescue Timeout::Error + replies.each do |data| + begin + reply = NFIdentifyReply.read(data) + rescue EOFError + # About 1% of responses are not always as expected from the controller + next + end + next if array.include?(reply.addr) + array << reply.addr if reply.header.seq == seq && reply.header.identify == NF_IDENTIFY_REPLY + end sock.close array end end