1

代码

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

上面的套接字连接返回给我:

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

4

2 回答 2

2

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

> 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,您将无法访问管理界面或其任何部分。返回并再次检查您发送的代码。

于 2013-02-17T18:18:38.197 回答
0

@布拉德谢谢。您对 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 后的函数结果如下:

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

在线(补品 - 如果你只能看到)流以 256 kbps 的速度上升,32 个听众中有 0 个(0 个唯一)

于 2013-02-18T03:27:02.363 回答