Python sendto () не выполняется - PullRequest
       50

Python sendto () не выполняется

0 голосов
/ 24 октября 2018

У меня есть программа, которая принимает координаты по UDP, перемещает оборудование и отвечает, когда работа завершена.

Кажется, у меня та же проблема, что и у этого парня:

Python sendto, похоже, не отправляет

Мой код здесь:

import socket
import struct
import traceback
def main():


    sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    sock.bind(('',15000))
    reply_sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)


    while True:
        try:
            data,addr = sock.recvfrom(1024)
            if data is not None:
                try:
                    coords = struct.unpack('>dd',data)

                    #Stuff happens here 

                    print(f'moved probe to {coords}')

                    reply_sock.sendto(bytearray.fromhex('B'),('10.0.0.32',15001))
                except:
                    traceback.print_exc()
                    try:
                        reply_sock.sendto(bytearray.fromhex('D'),('10.0.0.32',15001))
                    except:
                        traceback.print_exc()
                    break
        except:
            pass

Программа ведет себя так, как будто вызов sendto только что передан;он принимает пакет, выполняет операторы печати и возвращается обратно (он может выполнить цикл несколько раз, но никогда не отвечает).Я смотрю на wireshark, и никакие пакеты никогда не отправляются за границу.Никаких ошибок не было.

Есть идеи, почему это происходит?

1 Ответ

0 голосов
/ 24 октября 2018

С документация :

Строка должна содержать две шестнадцатеричные цифры на байт с пропуском ASCII.

Так происходит:

$ python3
Python 3.6.6 (default, Sep 12 2018, 18:26:19) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> bytearray.fromhex('B')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: non-hexadecimal number found in fromhex() arg at position 1
>>> 

Попробуйте:

reply_sock.sendto(bytearray.fromhex('0B'),('10.0.0.32',15001))

, если вы это имеете в виду.

Обратите внимание, что ваш except ловит все исключения, а не только те, которые вы ожидаете, поэтому вы не видите ошибку, которую вы вызываете.Попробуйте вместо этого использовать что-то вроде except OSError.

Кроме того, подумайте об уменьшении количества кода в ваших try разделах:

coords = struct.unpack('>dd',data)

#Stuff happens here 

print(f'moved probe to {coords}')

bytes_to_send = bytearray.fromhex('0B')
try:
    reply_sock.sendto(bytes_to_send,('10.0.0.32',15001))
except IOError as e1:
    print(e1)
    traceback.print_exc()

    bytes_to_send = bytearray.fromhex('0D')
    try:
        reply_sock.sendto(bytes_to_send,('10.0.0.32',15001))
    except IOError as e2:
        print(e2)
        traceback.print_exc()
        break

Таким образом вы защищаете только код, который вы хотите.

...