Python sendto() 不执行

我有一个程序可以通过 UDP 接受坐标,移动一些设备,然后在工作完成后回复。


我的代码在这里:


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,没有数据包发送出站。不会抛出任何错误。


任何想法为什么会发生这种情况?


MM们
浏览 335回答 1
1回答

繁花不似锦

从文档:该字符串必须包含每个字节的两个十六进制数字,ASCII 空格将被忽略。所以会发生这种情况:$ python3Python 3.6.6 (default, Sep 12 2018, 18:26:19)&nbsp;[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linuxType "help", "copyright", "credits" or "license" for more information.>>> bytearray.fromhex('B')Traceback (most recent call last):&nbsp; File "<stdin>", line 1, in <module>ValueError: non-hexadecimal number found in fromhex() arg at position 1>>>&nbsp;试试这个:reply_sock.sendto(bytearray.fromhex('0B'),('10.0.0.32',15001))如果这就是你的意思。请注意,您except正在捕获所有异常,而不仅仅是您期望的异常,因此您没有看到导致的错误。考虑使用类似except OSError这里的东西。另外,请考虑减少部分中的代码量try:coords = struct.unpack('>dd',data)#Stuff happens here&nbsp;print(f'moved probe to {coords}')bytes_to_send = bytearray.fromhex('0B')try:&nbsp; &nbsp; reply_sock.sendto(bytes_to_send,('10.0.0.32',15001))except IOError as e1:&nbsp; &nbsp; print(e1)&nbsp; &nbsp; traceback.print_exc()&nbsp; &nbsp; bytes_to_send = bytearray.fromhex('0D')&nbsp; &nbsp; try:&nbsp; &nbsp; &nbsp; &nbsp; reply_sock.sendto(bytes_to_send,('10.0.0.32',15001))&nbsp; &nbsp; except IOError as e2:&nbsp; &nbsp; &nbsp; &nbsp; print(e2)&nbsp; &nbsp; &nbsp; &nbsp; traceback.print_exc()&nbsp; &nbsp; &nbsp; &nbsp; break这样您就可以只保护您想要的代码。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python