From: Robert McGovern Date: 2002-09-20T07:38:43+09:00 Subject: don't understand cause of `sysread': Bad file descriptor (Errno::EBADF) Was writting a script to poll an audiotron (www.audiotron.net) and record a list of the music that has been played. The audiotron has an internal webserver so I used the net/http package. The script runs fine for a while, but after about the 11th pass it falls over with the following error: I:/development/ruby/lib/ruby/1.7/net/protocol.rb:501:in `sysread': Bad file descriptor (Errno::EBADF) from I:/development/ruby/lib/ruby/1.7/net/protocol.rb:501:in `rbuf_fill' from I:/development/ruby/lib/ruby/1.7/net/protocol.rb:443:in `read' from I:/development/ruby/lib/ruby/1.7/net/http.rb:1520:in `read_chunked' from I:/development/ruby/lib/ruby/1.7/net/http.rb:1494:in `read_body_0' from I:/development/ruby/lib/ruby/1.7/net/http.rb:1477:in `read_body' from I:/development/ruby/lib/ruby/1.7/net/http.rb:1463:in `reading_body' from I:/development/ruby/lib/ruby/1.7/net/http.rb:780:in `request' from I:\ruby stuff\audiotron-play-watcher.rb:37 from I:\ruby stuff\audiotron-play-watcher.rb:36:in `start' from I:\ruby stuff\audiotron-play-watcher.rb:36 I'm puzzeled as to what the problem is. The page is always there, if will update if continually refreshed in a browser without a problem. What file descriptor is being referred to here? Anyone have any thoughts or comments? TIA Rob <<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>> require 'english' require 'net/http' require 'log4r' include Log4r # set up logger atlog = Logger.new 'atlog' outputter = FileOutputter.new( atlog, { 'filename', './at.log', 'trunc', false } ) outputter.formatter = PatternFormatter.new :pattern => "[%l] %d :: %m" atlog.outputters = outputter # set up connection details for audiotron req = Net::HTTP::Get.new('apigetstatus.asp') address = Net::HTTP.new('atron00427c', 80) req.basic_auth 'admin','admin' response = nil previousFile = nil currentFile = nil currentArtist = nil currentAlbum = nil currentTrack = nil currentGenre = nil currentPlayStyle = nil currentTrackLength = 0 queueLength = 0 currentIndex = 0 passes = 0 while true atlog.debug("Pass #{passes}") passes += 1 address.start { |http| response = http.request(req) # <<<---- problem line } response.body.each { | line | if line =~ /TotalTime=/ currentTrackLength = $POSTMATCH elsif line =~ /RANDOM_LED=/ if $POSTMATCH currentPlayStyle = "random" else currentPlayStyle = "ordered" end elsif line =~ /^Title=/ currentTrack = $POSTMATCH.chomp elsif line =~ /^Artist=/ currentArtist = $POSTMATCH.chomp elsif line =~ /^Album=/ currentAlbum = $POSTMATCH.chomp elsif line =~ /^Genre=/ currentGenre = $POSTMATCH.chomp elsif line =~ /^SourceID=/ currentFile = $POSTMATCH.chomp elsif line =~ /^QueueLen=/ queueLength = $POSTMATCH.chomp elsif line =~ /^CurrIndex=/ currentIndex = $POSTMATCH.chomp end } if currentFile != previousFile atlog.info("Playing track #{currentIndex} of #{queueLength} in a #{currentPlayStyle} way\n" + "#{currentTrack} by #{currentArtist} on #{currentAlbum} is #{currentTrackLength} seconds long\n" + "File is :- #{currentFile}\n") previousFile = currentFile end currentFile = nil currentTrack = nil currentArtist = nil currentAlbum = nil currentGenre = nil currentPlayStyle = nil currentTrackLength = nil queueLength = 0 currentIndex = 0 response = nil sleep 5 end