0

sinatra でサービスのダンプを取り、それを Web ページのコンテンツ領域に表示する必要があります。

コードを介してアクセスする必要があるサービスは、サーバーのポート 6557 で実行されます。暗号化や認証は使用しません。httpのような単純な読み取り専用のリクエスト応答です。これがターミナルで機能するものです

$ echo "GET hosts" | nc 192.168.1.1 6557

意図した出力が得られます。sinatra アプリケーションを使用して同様のことを行う必要があります。

私はこのコードを書きましたが、ひどく間違っています。コードやルックアップ資料、または例を手伝ってくれる人はいますか。

get '/' do
        host = "192.168.1.1"
        port = 6557
        dat = ""
        @socket = TCPSocket.open (host, port)
                while(true)
                        if(IO.select([],[],[@socket],0))
                                socket.close
                                return
                        end
                        begin
                                while( (data = @socket.recv_nonblock(100)) != "")
                                        dat = dat+ data
                                end
                                rescue Errno::EAGAIN
                        end
                        begin
                                @str = "GET hosts"
                                @socket.puts(@str);
                        rescue Errno::EAGAIN
                        rescue EOFError
                                exit
                        end
                        IO.select([@socket], [@socket], [@socket])
                end
        @line = dat
        erb :info
end

実行中のコードがハングアップします。また、可能であれば、問題の概念的なコンテキストを取得するために読むためのリンクをいくつか提供してください。

4

2 に答える 2

0

バッククォートまたはコマンドを使用して、Ruby から直接シェル コマンドを実行できますsystem。このようなものがあなたのために働くかもしれません:

get "/" do
  @line = `echo "GET hosts" | nc 192.168.1.1 6557`
  erb :info
end

詳細については、Kernel#system の ruby​​ ドキュメントを参照してください。

于 2012-10-08T11:09:57.433 に答える
0

シェル コマンドに相当する Ruby は、次のように単純である必要があると思います。

require "socket"

socket = TCPSocket.new "192.168.1.1", 6557
socket.puts "GET hosts"
socket.read

ドキュメントによると、 #read はソケットを自動的に閉じる必要があるため、手動で行うことを心配する必要はありません。

于 2012-10-18T12:39:44.783 に答える