You definitely want to use blocking I/O (since that's the point of the program) and you want to set the correct bits in your select statement. Straight from the horse's mouth: All filehandles passwd to IO::Select "must be references to file glob handles." That done, you need to block as you do, but to determine which is ready, you simply check the array for a file handle glob. What is returned in the array is ready for reading, so you should read from it (if your interested in what arrived) with the IO::Socket recv function. Of course, you are also missing error handling in your loop which you should be checking with $selobj->has_error. Also a minor issue, but you should probably ignore SIGURG. Not a big deal but M*crosoft made the mistake in their famous OS which was quite humiliating.