2017-09-09 4 views
1

私は1つのスクリプト(pythonスクリプト)がサーバーをホストし、rubyスクリプトが接続した後、pythonスクリプトがプロンプトを表示し、データを接続したRubyクライアントに送信すると、rubyプログラムはシステム関数を介してコマンドを実行します。エラーはコマンドをサーバ上で終了する(pythonスクリプト)ため、コマンドを1つしか送信できません。ルビースクリプトが実行され、コマンドを受け取ったときにコマンドを実行して実行します。ここではスクリプトは、次のとおりです。PythonとRubyのソケットプログラムでエラーが発生しました。

のpython:

#!/usr/bin/env python 
import socket 
import time 
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
sock.bind(('192.168.1.104',567)) 
sock.listen(1) 
(client,(ip,port))=sock.accept() 
print('[*] Connection from {} via port {}').format(ip,port) 
while True: 
    cmd = raw_input("# ") 
    client.send(str(cmd)) 

ルビー:

class C 
    attr_accessor :clr 
end 
    r = C.new 
    r.clr = "\033[0;31m" 
    d = C.new 
    d.clr = "\033[0;00m" 
require 'socket' 
def sock_setup(address,port) 
    @addr = address 
    @port = port.to_i 
    @socket = TCPSocket.open(@addr,port) 
    while TRUE 
     @cmd = @socket.read(1024) 
     puts @cmd 
     system(@cmd) 
    end 
end 
print("Address=> ") 
@host = $stdin.gets.chomp 
print("\n") 
print("Port=> ") 
@port_ = $stdin.gets.chomp 
sock_setup(@host,@port_) 

答えて

1

私はルビーとは専門家だが、それだけだろう。すなわちread(size)は、ブロックのように多くの言語で実装されていますsizeバイトが読み込まれるか、接続が閉じられる(EOF)と返されます。 the documentationを見てみると、Rubyで同じであるように思わ:このメソッドは、関数freadのように振る舞うことを

注()関数をCでこれはそれを指定してデータを読み取るために(2)システムコールを読む呼び出すため再試行を意味し、長さ(またはEOFまで)。この動作は、iosが非ブロックモードであっても保持されます。

これは、1024バイトを取得するか、接続が閉じられるかのいずれかを待機することを意味します。送信するコマンドがおそらく1024バイト未満であるため、接続の終了時にのみコマンドを実行します。あなたは、単一の読み取り(2)システムコールのような動作が必要な場合

、readpartial、#read_nonblockとにsysreadを考慮してください。

同じドキュメント

も、あなたがこの振る舞いが気に入らない場合に使用すべきかを示唆しています。

一度に送信されたすべてのデータが、sysreadなどのピア内で一度に受信される保証はありません。これは、少量のデータを送信する場合にのみ機能しますが、大量のデータが失われても、実際にはすべてのデータを読み取るのに複数のsysreadが必要になる場合があります。また、TCPはストリーミングプロトコルであるため、暗黙的なメッセージ境界はないため、受信者が完全にメッセージを読む機会を得る前に、別のメッセージが送信者によって送信される可能性がある場合に備えて、最初の1つ。

0

私は

@cmd = @socket.read(1024) -> @cmd = @socket.gets(1024) 
を「取得」するために「読み」変更することで、エラーを修正することができました
関連する問題