无法在Python中读取套接字流,卡在recvfrom处。适用于 DotNet/终端

问题描述 投票:0回答:1

我有一个可以将模拟音频转换为数字音频的设备,并且有一种方法可以通过 UDP 协议收听本地服务器中的流。

  • 工作-在我的终端中,如果我运行
    echo 'subscribe' | nc -u 192.168.0.194 9444
    ,我会收到大约 15 秒的响应,如下所示,我应该能够将其转换为可以播放的音频:
?a?????̻?yyzzyyzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}}|||}|}~~~~~~~~~~~}~~~~~~}}~~~}}}}}|||||}|||||||||||}|||||||||||{{{{{{{{{{{{{{zzzzzzzzzzzzzz?a???p?̻?zzzzzzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzywxxxxxwwxxxxxxxxxxxyyyzzyyzyyyyyyyyyzzzyyyyzzzzzzzzz{zz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|{|||||||||||||||||||||||||||||?a???P?̻?||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}||||}|}~~~~~~~~~~~}~~~~~~}}}}~~~}}}}|||||}||||||||||||||||||{|||{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy?a???0?̻?yyyzzzzzzzzzzyzzzyyzzzzzzzzzzzzzzzzzzzzzzxwwwxxxxwwxxxxxxxxxxyyyzyyyyyyyyyyzzzyyyyyyyyzzzzzzzzzzz{zz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}~~~~~~~~~~?a???̻?~~~~}}~~~~~}}}}}}}}}}|||{|}|||||||||}}|||||||{|||{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxyyyyyyyyyyyzyyyyzzzzzzzzyyyyyzzzzzzzzzzzzzzzzzzzzxwwwxxxxwwxxxxxxxxxxxyyyyyyyyyyyyzzzyxy?a????̻?yyzzyyzzzzzzzzzzzz{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}}||||||}~~~~~~~~~~~~~}}}~~~~~}}~}}}}}}}||{|}|||||||||||||||||{{||{{{{{{{{{{{{{{{zzzzzzzzzzzzzzz?a????̻?zzzzzzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzyyzzzzzzzzzzzzzzzzzzzzzzzzzzzxwwxxxxxwxxxxxxxxxxxyyyzyyzyyyyyyzzzyyyyyyyyzzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||||||||||||||||?a?İ?̻?||||||||||||||||||||{||{|||||||||||||||||||||||||||||||||||||}}}||||}~~~~~~~~~~~~~~~~~~~~}}}~~~~}}}||||{|}||||||||||||||||||||||{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxyyyyyyyzy?a?Ɛ?̻?zzzzzzzzzzzzyyzzzzyzzzzzzzzzzzzzzzzzzzzzzxwxxxxwwwxxxxxxxxxxxyyyzyyyyyyyyyzzzyyyyyzyyzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|{||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||~~~~~~~~~~?a??p?̻?~~~}}}~~~~~~~~}}}}}}}||{|}||||||||||||}}||{{|||{|{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxwxxxxwwwxxxxxxxxxxxyyyzyyyyyyzyyyyzzzz?a??P?̻?yyyyyzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}}}||||}~~~~~~~~~~~~~~~~~~}}}}}~~}}}}||||{|}|||||||||||||||||{||{|{{{{{{{{{{{{{{zzzzzzzzzzzzzzz?a??0?̻?zzzzzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxyyyyyyyyyyyyzyyzzzzzzzzzyyzzzzzzzzzzzzzzzzzzzzzzzywwwxxyyxxwxxxxxxxxxxyyyzyyzyyyyyyzzzyyyyzyyyzzzzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||||||||||||||||||????̻?|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}}}}|}}}~~~~~~~~~~~}~~~~~~}}~~~}}}}}|||||}|||}|||||||||||||||||||{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyyyyyyzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzz?a  ????̻?zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzywwwxxyyxxxxxxxxxxyyyyyyzyyzyyyyyyzzzzyyyzzzyyzzzzzzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}}}}||}}}~~~~~~~?a...
  • 工作 - 当我尝试在 C# 中运行它时,我得到了类似的响应:
async Task StartListener(){
     UdpClient listener = new UdpClient(9444);
     IPEndPoint groupEP = new IPEndPoint(IPAddress.Parse("192.168.0.194"), 9444);
     byte[] requestMessage = Encoding.ASCII.GetBytes("subscribe");
     await listener.SendAsync(requestMessage, requestMessage.Length, groupEP);
     while (true){            
            await listener.SendAsync(requestMessage, requestMessage.Length, groupEP);
            var udpReceiveResult = await listener.ReceiveAsync(); //Waiting for broadcast
            byte[] bytes = udpReceiveResult.Buffer;
            Console.WriteLine($"Received broadcast from {groupEP} : {Encoding.ASCII.GetString(bytes, 0, bytes.Length)}");
  • 不工作-在Python中,我使用以下脚本,但它在接收函数处超时,即使Wireshark显示UDP数据包(与工作实例类似)正在从该设备正确启动并发送到我的笔记本电脑。不确定我的代码有什么问题
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b"subscribe", ("192.168.0.194", 9444))
sock.connect(("192.168.0.194", 9444)) # Keeping this seems to make no difference
sock.settimeout(5)

try:
    while True:
        print("Stream receiving.") # Receive data from UDP
        data, addr = sock.recvfrom(1024) # <-GETS STUCK HERE, then times out
        print(data) # Doesnt land here, prints nothing
        
except KeyboardInterrupt:
    pass
finally:    
    sock.close() # Stream stopping
print("Stream closed and socket closed.")

无用的错误消息,因为没有添加超时,它只是停留在

sock.recvfrom
线上并且不执行任何操作,即使在设备停止发送数据之后也是如此:

Traceback (most recent call last):
  File "/Users/saamer/Documents/GitHub/api/a2.py", line 11, in <module>
    data, addr = sock.recvfrom(1024)  # Buffer size is ?? bytes
                 ^^^^^^^^^^^^^^^^^^^
TimeoutError: timed out

可能有用的信息:

最终我希望能够做一些这样的事情来播放音频。我试图向 chatGPT 询问这个问题,它建议的唯一一件事就是更改

recvfrom()
内的值,我对 100 万进行了更改,但没有任何积极结果 Image showing packets in Wireshark

python .net sockets udp pyaudio
1个回答
0
投票

我必须将之前的所有代码更改为这个确切的顺序:

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("0.0.0.0", 9444)) # Throws an error if it's anything else
sock.sendto(b"subscribe", ("192.168.0.194", 9444)
try:
...

其余代码有效。还是不知道我是怎么想出来的。但基本上

0.0.0.0
允许监听来自该端口的所有数据包,并且它不允许我绑定到
192.168.0.194

© www.soinside.com 2019 - 2024. All rights reserved.