Я пытаюсь использовать 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 - сервер, описанный выше.
Какие-нибудь советы? Заранее спасибо.
У вас ситуация с тупиком: клиент отправляет неполную строку и ожидает, что сервер отправит что-то, сервер ждет завершения строки или EOF, прежде чем отправит ответ.
Итак, теперь у вас есть 2 способа действовать сейчас:
\n
к отправляемой строке.sock.shutdown(socket.SHUT_WR)
после записи, но перед чтением.