Python sendto() 未执行
Python sendto() not executing
我有一个程序可以通过 UDP 接受坐标,移动一些设备,然后在工作完成后回复。
我好像和这个人有同样的问题:
Python sendto doesn't seem to send
我的代码在这里:
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,没有数据包被发送出站。不会抛出任何错误。
知道为什么会这样吗?
The string must contain two hexadecimal digits per byte, with ASCII
whitespace being ignored.
所以会发生这种情况:
$ 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
通过这种方式,您仅保护了您想要保护的代码。
我有一个程序可以通过 UDP 接受坐标,移动一些设备,然后在工作完成后回复。
我好像和这个人有同样的问题:
Python sendto doesn't seem to send
我的代码在这里:
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,没有数据包被发送出站。不会抛出任何错误。
知道为什么会这样吗?
The string must contain two hexadecimal digits per byte, with ASCII whitespace being ignored.
所以会发生这种情况:
$ 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
通过这种方式,您仅保护了您想要保护的代码。