Ошибка «Ресурс временно недоступен» при получении сокета из теста Python со второго запускаPython

Программы на Python
Ответить
Anonymous
 Ошибка «Ресурс временно недоступен» при получении сокета из теста Python со второго запуска

Сообщение Anonymous »

У нас есть процесс (C++), работающий на удаленном компьютере, который имеет сокет и отправляет ответ на основе полученного сообщения. У нас есть тестовая программа (python) на локальном компьютере, которая отправит сообщение процессу C++, работающему на удаленном компьютере. Когда я запускаю процесс C++ на удаленном компьютере и запускаю тестовую программу на локальном компьютере, тест получает ответ и завершается успешно. Но когда я запускаю тест снова, он не получает ответа и выдает ошибку «Ресурс временно недоступен». Если я снова остановлю и перезапущу процесс C++ на удаленном компьютере, тестовая программа на локальном компьютере будет работать нормально.
По сути, когда я перезапускаю процесс C++ на удаленном компьютере и запускаю тест, он получает правильный ответ и последующие запуски теста (без завершения процесса на удаленном компьютере), что приводит к ошибке «Ресурс временно недоступен».
Тестовый код Python, связанный с сокет:

Код: Выделить всё

def connect_sub(remote_machine_ip):
context = zmq.Context()
sock = context.socket(zmq.SUB)
sock.setsockopt_string(zmq.SUBSCRIBE, '')
try:
sock.setsockopt(zmq.RCVTIMEO, 10000)
sock.connect(f'tcp://{remote_machine_ip}:5570')
except socket.error as e:
info(f"research socket error : {e}")
return sock

def read_research(sock):
try:
message = sock.recv()
info("Got message on research socket")
except zmq.error.Again as e:
info(f"Error on socket : {e}")

def gather_research(sock):
researcher = threading.Thread(target=read_research, args=(sock))
researcher.start()
return researcher;

def send_receive(ip):
researcher = gather_research(*connect_sub(ip))
# send message to remote machine C++ process here.
researcher.join()

send_receive(remote_machine_ip)
Код C++, работающий на удаленном компьютере:

Код: Выделить всё

// Below code is in a constructor
socket = zmq_socket(ZContext::context(), ZMQ_PUB);
endpoint_ = "tcp://" + my_ip + ":" + "5570";
zmq_bind(socket, endpoint_.c_str());

// Below code is in a loop, when we receive a message, will send the response
socket.send(msg);
С помощью журналов отладки проверено, что каждый раз, когда тест запускается на локальном компьютере, процесс C++ (работающий на удаленном компьютере) получает сообщение, обрабатывает его и отправляет сообщение в сокет (tcp). . Но тест получает сообщение только при первом запуске после запуска процесса C++ на удаленном компьютере. Последующие запуски того же теста не получают сообщение и выдают ошибку «Ресурс временно недоступен», хотя процесс C++ на удаленном компьютере отправляет сообщение. Если я перезапущу процесс C++ на удаленном компьютере, при первом запуске теста будет получено сообщение, а последующие запуски снова завершатся неудачей.
Я подумал, что это может быть проблема со временем, и увеличил время ожидания сокета в протестируйте до 10 секунд (вместо 200 миллисекунд), но бесполезно. Может кто-нибудь помочь мне, если есть какая-либо проблема, вызывающая эту проблему.
Примечание: tcpdump показывает, что локальный компьютер получает пакеты с удаленного IP-адреса, но тест не может получить сообщение.

Подробнее здесь: https://stackoverflow.com/questions/792 ... st-from-se
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»