1

我正在尝试使用 xinetd 远程运行命令(traccejob)。当我通过 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。

所以你现在有两种方法可以继续:

  1. 将 a 附加\n到正在发送的字符串。
  2. sock.shutdown(socket.SHUT_WR)在写入之后但在读取之前“半关闭”客户端的套接字。
于 2011-08-25T16:40:28.227 回答