1

コマンド (tracejob) をリモートで実行するために xinetd を使用しようとしています。telnet 経由で接続すると、すべて正常に動作します。残念ながら、私が作成したクライアントはサーバーからデータを受信して​​いないようです。コードは次のようになります。

サーバ:

import sys
import commands

def main():
        tjinput = sys.stdin.readline().strip()
        (ret, out) = commands.getstatusoutput('/usr/bin/tracejob '+tjinput)
        print out
        sys.stdout.flush()

if __name__ == "__main__":
        main()

クライアント:

host = 'xxx.xxx.xxx.xxx'
port = 12345

import socket
import sys


def main(argv):
        message = 'hello'
        sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        sock.connect((host, port))
        sock.send(message)
        data = sock.recv(1024)
        sock.close()
        print repr(data)

if __name__ == '__main__':
        main(sys.argv)

クライアント プロセスは sock.recv(1024) 行で停止します。sock.recv がソケットからの出力を読み取っていない理由は、私の人生ではわかりません。おそらくコーディングの問題ですか?役に立った場合、xinetd.d ファイルは次のようになります。

service tracejob
{
        flags                   = IPv4
        disable                 = no
        socket_type             = stream
        wait                    = no
        user                    = root
        group                   = root
        server                  = /usr/local/bin/tracejob_xinetd.py
        port                    = 12345
        type                    = UNLISTED
}

ここで、tracejob_xinetd.py は上記のサーバーです。

任意のヒント?前もって感謝します。

4

1 に答える 1

1

デッドロックの状況: クライアントは不完全な行を送信し、サーバーが何かを送信するのを待ちます。サーバーは、応答を送信する前に行の完了または EOF を待ちます。

したがって、次の 2 つの方法で進めることができます。

  1. \n送信される文字列にa を追加します。
  2. sock.shutdown(socket.SHUT_WR)書き込み後、読み取り前にクライアント側のソケットを「半閉じ」ます。
于 2011-08-25T16:40:28.227 に答える