Сценарий Python 2.7 работает с точкой останова в режиме отладки, но не при запуске - PullRequest
0 голосов
/ 26 июня 2018
def mp_worker(row):
    ip = row[0]
    ip_address = ip
    tcp_port = 2112
    buffer_size = 1024

    # Read the reset message sent from the sign when a new connection is established
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        print('Connecting to terminal: {0}'.format(ip_address))
        s.connect((ip_address, tcp_port))

        #Putting a breakpoint on this call in debug makes the script work
        s.send(":08a8RV;")

        #data = recv_timeout(s)
        data = s.recv(buffer_size)

        strip = data.split("$", 1)[-1].rstrip()
        strip = strip[:-1]
        print(strip)
        termStat = [ip_address, strip]

        terminals.append(termStat)

    except Exception as exc:
        print("Exception connecting to: " + ip_address)
        print(exc)

Приведенный выше код является разделом скрипта, который вызывает проблему. Это довольно простая функция, которая подключается к сокету на основе переданного IP-адреса из запроса БД и получает ответ, который указывает версию аппаратного обеспечения аппаратного обеспечения.

Теперь проблема в том, что когда я запускаю его в режиме отладки с точкой останова на сокете, я получаю весь ожидаемый ответ от аппаратного обеспечения, но если у меня нет точки останова или я полностью запустился, запустите скрипт отвечает только частью ожидаемого сообщения. Я попытался поместить time.sleep () после отправки, чтобы увидеть, получит ли он полный ответ, и попытался использовать закомментированный метод recv_timeout (), который использует неблокирующий сокет и тайм-аут, чтобы получить Весь ответ, оба с одинаковыми результатами.

Как еще одно замечание, это работает в сценарии со всем в одном основном блоке кода, но мне нужно эту часть разделить на функцию, чтобы я мог использовать ее с библиотекой многопроцессорной обработки. Я попытался запустить его как на локальном компьютере с Windows 7, так и на сервере Unix с одинаковыми результатами.

Ответы [ 2 ]

0 голосов
/ 09 июля 2018

Я только недавно нашел решение здесь и решил опубликовать его на случай, если у кого-то возникнет проблема, я просто решил попробовать вызвать socket.recv () перед вызовом socket.send () и затем вызвать socket. recv () снова после этого, и, похоже, это решило проблему; Я не могу действительно сказать вам, почему это работает.

data = s.recv(buffer_size)

s.send(":08a8RV;")

data = s.recv(buffer_size)
0 голосов
/ 05 июля 2018

Я буду расширяться и повторять то, что я положил в комментарий минуту назад. Я до сих пор не совсем уверен, что стоит за разным поведением в обоих сценариях (кроме предположения о времени, явно опровергнутого попыткой включить sleep.

Однако это несколько несущественно, поскольку потоковые сокеты не гарантируют, что вы получите все запрошенные данные сразу и порциями в соответствии с запросом. Это для приложения, чтобы иметь дело с. Если сервер закрывает сокет после отправки полного ответа, вы можете заменить:

data = s.recv(buffer_size)

с recv() до получения нулевых байтов, это будет эквивалентно получению 0 (EOF) из системного вызова:

data = ''
while True:
    received = s.recv(buffer_size)
    if len(received) == 0:
        break
    data += received

Если это не так, вам придется полагаться на фиксированный или известный (отправленный в начале) размер, который вы хотите рассмотреть вместе. Или справьтесь с этим на уровне протокола (ищите символы, последовательности, используемые для обозначения границ сообщений.

...