尝试使用udp套接字从远程设备接收数据

时间:2019-08-06 21:00:57

标签: python python-3.x sockets tcp

我正在尝试将命令发送到远程设备: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的工作方式,但是我希望/期望的是,我发送到远程设备的数据会生成一个响应,该响应会发回给我。 现在它刚刚挂起。

1 个答案:

答案 0 :(得分:1)

socket.accept()仅在已配置为侦听套接字的基于流的套接字的上下文中相关。在数据报套接字上使用没有意义,尤其是已经与远程主机关联的套接字。

(您确定SOCK_DGRAM(即UDP)在这里正确吗?我使用过的大多数SCPI设备都使用TCP,即SOCK_STREAM。)

如果您确定使用的协议正确,请删除对s.accept()的调用,然后在现有套接字.recv()上调用s