为了账号安全,请及时绑定邮箱和手机立即绑定

Python sendto() 不执行

Python sendto() 不执行

MM们 2021-07-22 18:07:44
我有一个程序可以通过 UDP 接受坐标,移动一些设备,然后在工作完成后回复。我的代码在这里:import socketimport structimport tracebackdef 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 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

从文档:


该字符串必须包含每个字节的两个十六进制数字,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

这样您就可以只保护您想要的代码。


查看完整回答
反对 回复 2021-07-28
  • 1 回答
  • 0 关注
  • 331 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信