Boa noite,
Sou iniciante na área de TV Digital e sei que este é um assunto que já foi muito discutido, lí diversas threads sobre o assunto aqui no forum, porém não consegui resolver o meu problema...
Estou tentando fazer uma chamada simples pelo canal de retorno usando o seguinte código:
------------ NCL ----------------
<?xml version="1.0" encoding="ISO-8859-1"?>
<ncl id="nclClicks" xmlns="http://www.ncl.org.br/NCL3.0/EDTVProfile">
<head/>
<body>
<port component="lua1" id="entryPoint"/>
<media id="lua1" src="1.lua"/>
</body>
</ncl>
-------------------------------------
---------- lua1.lua ------------
require 'tcp'
function handler (evt)
if evt.class ~= 'ncl' then
return
end
tcp.execute(
function ()
print ("-- start TCP --")
tcp.connect('www.google.com.br', 80)
tcp.send('GET /search?q='..'globo'..'\n')
local result = tcp.receive()
print ('Result: ' .. result)
tcp.disconnect()
end
)
end
event.register(handler)
-------------------------------------
E estou recebendo o seguinte erro:
---------- Erro ---------------
compile time: 9 ms
ComponentManager::getComponent opening component 'libginganclluapadapter.so'
ComponentManager::getComponent component 'libginganclluapadapter.so' OPENED
ComponentManager::getComponent opening component 'libgingaccplalua.so'
ComponentManager::getComponent component 'libgingaccplalua.so' OPENED
FormatterScheduler::runProceduralAction preparing display
FormatterFocusManager::showObject Warning! descriptor is null.
-- start TCP --
reloaded DNS configuration (resolv.conf)
changing nameserver to 192.168.185.2
PANIC: unprotected error in call to Lua API (./tcp.lua:20: ./tcp.lua:101: assertion failed!)
(!!!) *** WARNING [Application exited without deinitialization of DirectFB!] *** [core.c:813 in dfb_core_deinit_check()]
...
----------------------------------
O arquivo tcp.lua que estou usando é o que está disponível no exemplo 06 do tutorial do Francisco, vou coloca-lo abaixo com as linhas 20 e 101 destacadas.
---------- tcp.lua --------------
--[[
-- TODO:
-- * nao aceita `tcp.execute` reentrante
--]]
local _G, coroutine, event, assert, pairs, type
= _G, coroutine, event, assert, pairs, type
local s_sub = string.sub
module 'tcp'
local CONNECTIONS = {}
local current = function ()
return assert(CONNECTIONS[assert(coroutine.running())])
end
local resume = function (co, ...)
assert(coroutine.status(co) == 'suspended')
assert(coroutine.resume(co, ...))
if coroutine.status(co) == 'dead' then
CONNECTIONS[co] = nil
end
end
function handler (evt)
if evt.class ~= 'tcp' then return end
if evt.type == 'connect' then
for co, t in pairs(CONNECTIONS) do
if (t.waiting == 'connect') and
(t.host == evt.host) and (t.port == evt.port) then
t.connection = evt.connection
t.waiting = nil
resume(co)
break
end
end
return
end
if evt.type == 'disconnect' then
for co, t in pairs(CONNECTIONS) do
if t.waiting and
(t.connection == evt.connection) then
t.waiting = nil
resume(co, nil, 'disconnected')
end
end
return
end
if evt.type == 'data' then
for co, t in pairs(CONNECTIONS) do
if (t.waiting == 'data') and
(t.connection == evt.connection) then
resume(co, evt.value)
end
end
return
end
end
event.register(handler)
function execute (f, ...)
resume(coroutine.create(f), ...)
end
function connect (host, port)
local t = {
host = host,
port = port,
waiting = 'connect'
}
CONNECTIONS[coroutine.running()] = t
event.post {
class = 'tcp',
type = 'connect',
host = host,
port = port,
}
return coroutine.yield()
end
function disconnect ()
local t = current()
event.post {
class = 'tcp',
type = 'disconnect',
connection = assert(t.connection),
}
end
function send (value)
local t = current()
event.post {
class = 'tcp',
type = 'data',
connection = assert(t.connection),
value = value,
}
end
function receive (pattern)
pattern = pattern or '' -- TODO: '*l'/number
local t = current()
t.waiting = 'data'
t.pattern = pattern
if s_sub(pattern, 1, 2) ~= '*a' then
return coroutine.yield()
end
local all = ''
while true do
local ret = coroutine.yield()
if ret then
all = all .. ret
else
return all
end
end
end
-------------------------------------
Estou usando a versão 0.10.1 do STB...
Obrigado!
Autor: Rafael Pinto
1111 comentários
Qual o sistema operacional ? Tem uma diferença (Windows e linux ) na formação do DNS no /etc/resolv.conf da máquina virtual. Qual o modo que esta utilizando a máquina virtual ? Como esta configurada a rede no vmware ? Bridged ou NAT ? Sua rede tem servidor DHCP ? Tem roteador ? Tem proxy ? Marco Munhoz
S.O. : Windows
Modo Rede: Bridged
Tenho DHCP
Tenho Proxy Estou tentando executar o link: nomeservidor/insere.php?voto=1 Mas o voto nunca chega no servidor. (digitando no navegador esse link, o voto insere no bd normalmente) O código LUA é esse: require 'tcp'
tcp.execute(
function ()
tcp.connect('nomeservidor.com.br', 80) *Esse servidor esta na rede local
tcp.send('GET /po/insere.php?voto=1 HTTP/1.0')
*Tentei também o comando: tcp.send('GET /po/insere.php?voto=1\n')
tcp.disconnect()
end
) O que pode estar errado?
> Thread: tcp.lua - assertion failure
> Author: Marco Munhoz
> Posted: 2009-11-09 10:03:39.241532-02
>
> Marcio ! bom dia, desculpe a demora na resposta, estava fora,
> impossibilitado de responder nos últimos dias. Se não ainda não teve
> resposta, podemos continuar o tópico, estudando algumas causas prováveis de
> erro, pois quase todos são geralmente ligados a configuração de rede e
> não do código. Começando pelas situações mais simples mas que podem
> complicar a nossa vida :
>
> Primeira situação :
>
> tcp.connect('nomeservidor.com.br', 80)
>
> O nome do servidor tem que ser válido, tem que estar cadastrado no DNS de
> sua rede.
>
> Segunda situação :
>
> Dentro da máquina virtual (set-top box)
>
> /etc/resolv.conf
>
> É necessário o nome de um servidor DNS interno ou público.
>
> Caso não resolver continuamos ...
>
>
>
> Marco Munhoz
>
>
>
>
>
> Recebendo correspondência demais? Gerencie suas notificações em:
> www.softwarepublico.gov.br/notifications/manage
>