我正在尝试将命令发送到远程设备:E5071C ENA Vector Network Analyzer
这些是我的问题:
当我尝试从套接字发送和接收数据时,它“挂起”。
我不确定应该使用哪种类型的套接字。
对于其他命令,我使用了s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
,但是在那种情况下我只需要发送数据。在这里,我需要发送和接收数据。我尝试过这样使用while True
循环:
while True:
s.settimeout(1)
print(sys.stderr, 'waiting for a connection')
connection, client_address = s.accept()
try:
print(sys.stderr, 'client connected:', client_address)
while True:
data = connection.recv(1024)
print(sys.stderr, 'received "%s"') % data
if data:
connection.sendall(data)
else:
break
finally:
connection.close()
在while循环中我也无法获得想要的结果,所以到目前为止,这是我所要做的:
## import modules
## for loop iterations
## commands sent to remote device using UDP socket
def is_hanging(host, port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
min_msg = ':CALCulate:SELected:MARKer:FUNCtion:TYPE MINimum'
s.send(min_msg.encode())
s.settimeout(1)
try:
s.recv(1024)
print("Received data!")
return True
except socket.timeout as e:
print(e)
return False
finally:
s.close()
if is_hanging('10.5.33.16',5025) is True:
pass
else:
raise Exception("Could not receive data.")
我不确定s.recv
的工作方式,但是我希望/期望的是,我发送到远程设备的数据会生成一个响应,该响应会发回给我。
现在它刚刚挂起。
答案 0 :(得分:1)
socket.accept()
仅在已配置为侦听套接字的基于流的套接字的上下文中相关。在数据报套接字上使用没有意义,尤其是已经与远程主机关联的套接字。
(您确定SOCK_DGRAM
(即UDP)在这里正确吗?我使用过的大多数SCPI设备都使用TCP,即SOCK_STREAM
。)
如果您确定使用的协议正确,请删除对s.accept()
的调用,然后在现有套接字.recv()
上调用s
。