【问题标题】:SHOUTcast fetch request denied every time with 404每次使用 404 拒绝 SHOUTcast 获取请求
【发布时间】:2013-02-15 09:45:05
【问题描述】:

代码

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)
        -- Further processing content here
    end
end
print( radiotest( "10.*.*.*", 1234 ) )

上面的socket连接返回我:

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() 获取页面?

【问题讨论】:

  • 任何不使用 luasocket 的 http 子模块而不是原始 tcp 的理由。 w3.impa.br/~diego/software/luasocket/http.html
  • @JaneT 我也会将它与游戏服务器合并,使用我已有的 DLL。
  • 你能发布一个数据包捕获吗?
  • @Brad 如果通过数据包捕获,您指的是我收到的数据,那么我已经将它放在问题中。 ICY 404 Resource Not Found 这是我得到的。如果不是你的意思,请告诉我如何获取数据包跟踪。
  • @BackinaFlash,我看到你发布的内容,但我更愿意查看原始数据包捕获,看看是否有任何奇怪的事情发生。您可以使用 Wireshark 进行捕获。 wireshark.org

标签: sockets lua shoutcast luasocket


【解决方案1】:

查看您的数据包捕获后,实际上通过网络发送的内容似乎是错误的。你的用户代理字符串没有成功:

> GET /index.html HTTP/1.0

< 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>

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

【讨论】:

    【解决方案2】:

    @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后的函数结果如下:

    在线(补品 - 如果你能看到)

    Online(Tonic - If You Can Only See) 流以 256 kbps 的速度上升,32 个听众中有 0 个(0 个唯一)

    【讨论】:

    • 当您可以简单地使用它提供的 XML 时,为什么要从管理界面中过滤掉 HTML?
    • @Brad erm,请解释一下?
    • 我不记得头顶上的 URL,但是登录到您的 SHOUTcast 管理面板,在其中一个页面的底部,有一个“查看 XML 统计信息”的链接.只需使用该 URL,这样您就有了与代码一致的内容,而不是从 HTML 中删除,这些 HTML 可能/将在未来版本的 SHOUTcast 中发生变化。
    • @Brad 但我在服务器上没有管理员权限。
    • 哦,那没关系。此外,对于您要连接的 SHOUTcast 版本,还有/7.html
    猜你喜欢
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 2019-12-01
    • 2013-06-28
    相关资源
    最近更新 更多