python xinetd 客户端未接收数据

1 投票
1 回答
1650 浏览
提问于 2025-04-17 00:21

我正在尝试使用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就是上面提到的服务器。

有什么建议吗?提前谢谢。

1 个回答

1

你遇到了一个死锁的情况:客户端发送了一行不完整的内容,然后在等服务器回复,而服务器则在等这一行完整或者等到文件结束(EOF)后才会回复。

所以现在你有两种解决办法:

  1. 在发送的字符串后面加一个\n,也就是换行符。
  2. 在客户端写完数据后,先“半关闭”这个连接,用sock.shutdown(socket.SHUT_WR),然后再去读取数据。

撰写回答