SHOUTcast获取请求每次都被拒绝,显示404错误。

代码

function radiotest(host,port)
    local rstr="Online"
    local sock, err = socket.tcp()
    if not sock then
        return "Failed"
    end
    sock:settimeout(1)
    local res, err = sock:connect(host, port)
    if not res then
        return "offline"
    else
        sock:settimeout(1)
        sock:send("GET /index.html HTTP/1.0\r\n UserAgent: SHOUTcast Song Status \r\n Accept: */*\r\n\r\n")
        sock:settimeout(3)
        local data=sock:receive('*a')
        sock:close()
        print(data)
        -- 其他处理内容在这里
    end
end
print(radiotest("10.*.*.*", 1234))

上述套接字连接返回给我:

ICY 404 Resource Not Found
icy-notice1:<BR>SHOUTcast Distributed Network Audio Server/win32 v1.9.7<BR>
icy-notice2:The resource requested was not found<BR>

我想问题在我的标头列表中,但我无法跟踪它。

所有浏览器都可以正常打开该页面(Opera需要伪装成另一个浏览器;否则它只会不断下载所有歌曲)。

我已经尝试在 sock:send()内使用以下字符串

  • GET /index.html HTTP/1.0\r\n UserAgent: SHOUTcast Song Status (Mozilla Compatible)\r\n\r\n
  • GET /index.html HTTP/1.0\r\n UserAgent: Opera/9.80 (Windows NT 6.1; Win64; x64) Presto/2.12.388 Version/12.12\r\n\r\n
  • GET /index.html HTTP/1.0\r\n UserAgent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17\r\n\r\n

我完全卡在这部分。我如何使用 socket.tcp() 获取页面?

点赞
用户362536
用户362536

经过查看您的数据包捕获,似乎实际发送到网上的内容有问题。您的用户代理字符串未被发送:

> GET /index.html HTTP/1.0

< ICY 404 资源未找到
< icy-notice1:<BR>SHOUTcast 分布式网络音频服务器/win32 v1.9.7<BR>
< icy-notice2:请求的资源不存在<BR>

如果您未指定包含“Mozilla”的用户代理,您将无法访问管理员界面或其中的任何部分。返回并再次检查您发送的代码。

2013-02-17 18:18:38
用户1190388
用户1190388

@Brad 感谢您的帮助,关于 Wireshark 的问题您给了很实用的建议。由于我在请求中提供了额外的空格,所以 User-Agent 头未被传递到服务器。

sock:send("GET /index.html HTTP/1.0\r\n UserAgent: SHOUTcast Song Status \r\n Accept: */*\r\n\r\n")

\r\n UserAgent: SHOUTcast Song Status 应该修改为:

\r\nUser-Agent: SHOUTcast Song Status

现在已经正常工作了。

感谢您的帮助。 :D

在过滤掉 HTML 后,函数的结果如下:

在线(Tonic - If You Could Only See)

在线(Tonic - If You Could Only See)256 kbps 的流正以 0 个听众(0 个独特的)为伴奏。

2013-02-18 03:27:02