module GxG::Support::Library::SocketIORecvFrom

Public Instance Methods

recvfrom(max_mesg_length=nil, flags=0) click to toggle source

Note: Allow aliases or existing recvfrom_nonblock to catch method references. Do not define recvfrom_nonblock here.

# File lib/gxg/gxg_io.rb, line 445
def recvfrom(max_mesg_length=nil, flags=0)
  # for now, flags ignored.  LATER: study Socket.recv message flags in detail
  if self.fcntl(::Fcntl::F_GETFL,::Fcntl::O_NONBLOCK) & ::Fcntl::O_NONBLOCK == ::Fcntl::O_NONBLOCK
    # on Winderz, just to a buffer sized spoon full until done ??
    if self.closed?()
      raise IOError, "attempting to recvmsg on a closed stream"
    else
      if @before_receive_data.respond_to?(:call)
        @before_receive_data.call()
      end
      begin
        result = self.recvfrom_nonblock(max_mesg_length, flags)
        #
      rescue ::IO::WaitReadable, ::IO::WaitWritable, GxG::IO::IO::WaitReadable, GxG::IO::IO::WaitWritable
        pause
        begin
          # about 10 ms
          selected = GxG::IO::IO::select([self],nil,nil,0.010)
          until selected
            pause
            selected = GxG::IO::IO::select([self],nil,nil,0.010)
          end
        rescue Exception
          pause
          retry
        end
        retry
      end
      #
      if result.is_a?(::Array)
        if result[0].is_a?(::String)
          result[0].force_encoding(::Encoding::ASCII_8BIT)
        end
      end
      if @after_receive_data.respond_to?(:call)
        @after_receive_data.call(result)
      end
    end
  else
    if self.closed?()
      raise IOError, "attempting to recvmsg on a closed stream"
    else
      if @before_receive_data.respond_to?(:call)
        @before_receive_data.call()
      end
      result = self.original_recvfrom(max_mesg_length, flags)
      if result.is_a?(::Array)
        if result[0].is_a?(::String)
          result[0].force_encoding(::Encoding::ASCII_8BIT)
        end
      end
      if @after_receive_data.respond_to?(:call)
        @after_receive_data.call(result)
      end
    end
  end
  result
end