0

アプリケーションにカスタムクラスがあり、サーバーでソケットを作成し、サーバーからの出力を読み取ります。問題は、出力が正しくないことです。私が見るところ、出力はssl暗号化の下にあり、それを読んだとき、それは間違っています。

これは私がssl接続を作成する魔女からの方法です

  def self.feedback_connection
    raise "The path to your pem file is not set. (APNS.pem = /path/to/cert.pem)" unless self.pem
    raise "The path to your pem file does not exist!" unless File.exist?(self.pem)

    context      = OpenSSL::SSL::SSLContext.new
    context.cert = OpenSSL::X509::Certificate.new(File.read(self.pem))
    context.key  = OpenSSL::PKey::RSA.new(File.read(self.pem), self.pass)

    fhost = self.host.gsub('gateway','feedback')
    puts fhost

    sock         = TCPSocket.new(fhost, 2196)
    sock.setsockopt Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true
    ssl          = OpenSSL::SSL::SSLSocket.new(sock,context)
    ssl.sync = true
    ssl.connect

    return sock, ssl
  end

それから、私の主な方法で

  def self.feedback
    sock, ssl = self.feedback_connection

    apns_feedback = []

    while line = sock.gets # Read lines from the socket << the problem is here
      line.strip!
      f = line.unpack('N1n1H140')       
      apns_feedback << [Time.at(f[0]), f[2]]
    end

    ssl.close
    sock.close

    return apns_feedback
  end

行で:while line = sock.gets私が使用する場合、私sock.getsは成文化された文字列を取得します。これを使用すると、ssl.read(38)nullが返されます。

この配置では、一度に38バイトを読み取る必要があります。

1..4 => timestamp (big endian)
5..6 => length (big endian)
7..38 => token (binary) quoting: The token in binary format.

だから私の問題は:sslではまったく読むことができず、異なる文字列を取得するたびにソケットで

正しい情報を読むために何ができますか?

4

1 に答える 1

0

問題が見つかりました。

サーバーは何も送信していませんでした。sslプロトコル、sslの空の応答は、sslなしでは読み取れないものであるためです。

それを確認した後、すべてが正常に動作します。

于 2013-03-20T14:01:57.493 に答える