У меня есть служба, поведение которой я отлаживаю за прокси. Прокси — это черный ящик, но поведение службы можно смоделировать с помощью тривиальной программы на Python, как показано ниже:
#!/usr/bin/env python
import socket
import sys
import time
PORT = int(sys.argv[1] or 50007)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.bind(('', PORT))
s.listen(1)
conn, addr = s.accept()
print('conn from %s' % (addr,))
data = conn.recv(1024)
time.sleep(1)
conn.sendall(data)
finally:
conn.close()
s.close()
Когда я подключаюсь к этому напрямую с помощью netcat, я получаю ожидаемое поведение, которое заключается в том, что после отправки произвольного текста на стандартный ввод с новой строкой сервер задерживается на секунду, возвращает его обратно и закрывает соединение. Однако, когда я размещаю эту службу за прокси-сервером, netcat вместо этого немедленно завершает работу со статусом 0, если я не задаю ей параметр -q с некоторым ненулевым числом, после чего она ведет себя так же, как и прямое соединение.
Чтобы процитировать справочную страницу для netcat в моей системе:
-q after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
Что я пытаюсь отладить, так это то, что отличается в поведении прокси-соединения, которое может привести к тому, что поведение соединения будет отличаться с опцией -q, и, к сожалению, справочная страница мало что делает, чтобы помочь меня. Что такое «stdin», на который он ссылается, если это не мой ввод (который никогда не получает от меня EOF)? Какой EOF -q игнорирует достаточно долго, чтобы получить обратно данные прокси-сервера, от которых ему не нужно игнорировать, когда нет прокси-посредника в соединении?
РЕДАКТИРОВАТЬ: По запросу вот несколько примеров вызовов, хотя они настолько просты, насколько это возможно:
# after starting the example server on <someserver> with <someport
$ echo foo | nc <someserver> <someport>
foo
$
# the above, just with -q1 (no change)
$ echo foo | nc -q1 <someserver> <someport>
foo
$
# after starting the example server behind the blackbox proxy
$ echo foo | nc <someproxy> <someproxyport>
$
# same, but with -q
$ echo foo | nc -q1 <someproxy> <someproxyport>
foo
$
nc
завершает работу до того, как буфер очищается и перенаправляется на ваш сервер Python? - person dnswlt   schedule 21.01.2017