我试图使用xinetd远程运行命令(tracejob)。当我通过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)行停止。我怎么也说不出是什么原因。Recv没有从套接字读取输出。可能是编码问题?如果有帮助的话,我想。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是上面描述的服务器。
提示吗?
你有一个死锁的情况:客户端发送一个不完整的行并等待服务器发送一些东西,服务器等待行完成或EOF在它发送一个回复。
现在你有两种方法继续
- 在发送的字符串后面附加一个
n
。 - 在写入之后,在读取之前,用
sock.shutdown(socket.SHUT_WR)
关闭客户端套接字。