Escrita de arquivo bloqueada quando há soquete presente no código

Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

Escrita de arquivo bloqueada quando há soquete presente no código

Eric Santos
Olá a todos.

Pra praticar um pouco a programação, estou fazendo um programa (extremamente) simples pra receber, tratar e responder requisições em JSON (algo como uma API Rest mesmo), porém, já faz alguns dias que estou me deparando com um problema que está me deixando com os cabelos em pé.

No momento, estou realizando a implementação de um sistema de log, pra registrar as requisições realizadas. Basicamente, ao receber uma requisição, o programa deve guardar num arquivo txt as informações de horário, ip e porta do cliente e a requisição. Porém, todas as vezes que eu tento realizar a escrita de dados nesse arquivo, isso simplesmente não ocorre, e o interpretador lua não retorna nenhum tipo de erro. Após alguns testes, notei que, apenas ao fechar o arquivo logo após a escrita dos dados desejados, esses dados são efetivamente armazenados. Caso contrário, mesmo que toda a parte de abertura de arquivo e escrita ocorra antes da declaração do soquete, a gravação de dados não ocorre. Um exemplo melhor pro meu caso é:

local file = io.open("log.txt", "a+")

file:write("requirement created")

file:close()

O código acima é interpretado perfeitamente. Porém se eu realizar algumas modificações para adicionar o soquete:

local socket = require "socket"
local file = io.open("log.txt", "a+")

file:write("requirement created")

local server = assert(socket.bind("*", 0))

while true do
client = server:accept()

msg = client:receive()

client:send(msg)

client:close()
end


file:close()


Apesar do código acima não ser explicitamente o do meu projeto, dá pra usá-lo como uma base para o que está acontecendo. No caso acima, a escrita de dados simplesmente não ocorre no tempo de execução do soquete.

Alguém pode me dar uma luz sobre o porquê disso estar acontecendo?

Obrigado pela atenção.
Grato.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Escrita de arquivo bloqueada quando há soquete presente no código

Breno Ramalho Lemes-2
Veja esse trecho do manual, acho que é o seu problema se entendi sua descrição: https://www.lua.org/manual/5.3/manual.html#pdf-file:setvbuf

Em Ter, 13 de nov de 2018 00:41, Eric Santos <[hidden email] escreveu:
Olá a todos.

Pra praticar um pouco a programação, estou fazendo um programa (extremamente) simples pra receber, tratar e responder requisições em JSON (algo como uma API Rest mesmo), porém, já faz alguns dias que estou me deparando com um problema que está me deixando com os cabelos em pé.

No momento, estou realizando a implementação de um sistema de log, pra registrar as requisições realizadas. Basicamente, ao receber uma requisição, o programa deve guardar num arquivo txt as informações de horário, ip e porta do cliente e a requisição. Porém, todas as vezes que eu tento realizar a escrita de dados nesse arquivo, isso simplesmente não ocorre, e o interpretador lua não retorna nenhum tipo de erro. Após alguns testes, notei que, apenas ao fechar o arquivo logo após a escrita dos dados desejados, esses dados são efetivamente armazenados. Caso contrário, mesmo que toda a parte de abertura de arquivo e escrita ocorra antes da declaração do soquete, a gravação de dados não ocorre. Um exemplo melhor pro meu caso é:

local file = io.open("log.txt", "a+")

file:write("requirement created")

file:close()

O código acima é interpretado perfeitamente. Porém se eu realizar algumas modificações para adicionar o soquete:

local socket = require "socket"
local file = io.open("log.txt", "a+")

file:write("requirement created")

local server = assert(socket.bind("*", 0))

while true do
client = server:accept()

msg = client:receive()

client:send(msg)

client:close()
end


file:close()


Apesar do código acima não ser explicitamente o do meu projeto, dá pra usá-lo como uma base para o que está acontecendo. No caso acima, a escrita de dados simplesmente não ocorre no tempo de execução do soquete.

Alguém pode me dar uma luz sobre o porquê disso estar acontecendo?

Obrigado pela atenção.
Grato.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Escrita de arquivo bloqueada quando há soquete presente no código

Hendrik Araujo
In reply to this post by Eric Santos
Eric, tudo bem?

O problema é que o arquivo nunca vai ser fechado nesse código, você está chamando o file:close() após um while true.

Você precisa sair do loop ou chamar file:close() dentro dele.

Em terça-feira, 13 de novembro de 2018 01:41:15 UTC-2, Eric Santos escreveu:
Olá a todos.

Pra praticar um pouco a programação, estou fazendo um programa (extremamente) simples pra receber, tratar e responder requisições em JSON (algo como uma API Rest mesmo), porém, já faz alguns dias que estou me deparando com um problema que está me deixando com os cabelos em pé.

No momento, estou realizando a implementação de um sistema de log, pra registrar as requisições realizadas. Basicamente, ao receber uma requisição, o programa deve guardar num arquivo txt as informações de horário, ip e porta do cliente e a requisição. Porém, todas as vezes que eu tento realizar a escrita de dados nesse arquivo, isso simplesmente não ocorre, e o interpretador lua não retorna nenhum tipo de erro. Após alguns testes, notei que, apenas ao fechar o arquivo logo após a escrita dos dados desejados, esses dados são efetivamente armazenados. Caso contrário, mesmo que toda a parte de abertura de arquivo e escrita ocorra antes da declaração do soquete, a gravação de dados não ocorre. Um exemplo melhor pro meu caso é:

local file = io.open("log.txt", "a+")

file:write("requirement created")

file:close()

O código acima é interpretado perfeitamente. Porém se eu realizar algumas modificações para adicionar o soquete:

local socket = require "socket"
local file = io.open("log.txt", "a+")

file:write("requirement created")

local server = assert(socket.bind("*", 0))

while true do
client = server:accept()

msg = client:receive()

client:send(msg)

client:close()
end


file:close()


Apesar do código acima não ser explicitamente o do meu projeto, dá pra usá-lo como uma base para o que está acontecendo. No caso acima, a escrita de dados simplesmente não ocorre no tempo de execução do soquete.

Alguém pode me dar uma luz sobre o porquê disso estar acontecendo?

Obrigado pela atenção.
Grato.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Escrita de arquivo bloqueada quando há soquete presente no código

Denis Dos Santos Silva
In reply to this post by Eric Santos
só para complementar...


dentro do while ficou faltando (caso queira gravar o conteúdo da mensagem no arquivo):

--
file:write( msg ); -- gravar a mensagem no arquivo
file:write( "\n" ); -- pular uma linha
file:flush(); -- esvazia os buffers
---



Em terça-feira, 13 de novembro de 2018 01:41:15 UTC-2, Eric Santos escreveu:
Olá a todos.

Pra praticar um pouco a programação, estou fazendo um programa (extremamente) simples pra receber, tratar e responder requisições em JSON (algo como uma API Rest mesmo), porém, já faz alguns dias que estou me deparando com um problema que está me deixando com os cabelos em pé.

No momento, estou realizando a implementação de um sistema de log, pra registrar as requisições realizadas. Basicamente, ao receber uma requisição, o programa deve guardar num arquivo txt as informações de horário, ip e porta do cliente e a requisição. Porém, todas as vezes que eu tento realizar a escrita de dados nesse arquivo, isso simplesmente não ocorre, e o interpretador lua não retorna nenhum tipo de erro. Após alguns testes, notei que, apenas ao fechar o arquivo logo após a escrita dos dados desejados, esses dados são efetivamente armazenados. Caso contrário, mesmo que toda a parte de abertura de arquivo e escrita ocorra antes da declaração do soquete, a gravação de dados não ocorre. Um exemplo melhor pro meu caso é:

local file = io.open("log.txt", "a+")

file:write("requirement created")

file:close()

O código acima é interpretado perfeitamente. Porém se eu realizar algumas modificações para adicionar o soquete:

local socket = require "socket"
local file = io.open("log.txt", "a+")

file:write("requirement created")

local server = assert(socket.bind("*", 0))

while true do
client = server:accept()

msg = client:receive()

client:send(msg)

client:close()
end


file:close()


Apesar do código acima não ser explicitamente o do meu projeto, dá pra usá-lo como uma base para o que está acontecendo. No caso acima, a escrita de dados simplesmente não ocorre no tempo de execução do soquete.

Alguém pode me dar uma luz sobre o porquê disso estar acontecendo?

Obrigado pela atenção.
Grato.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Escrita de arquivo bloqueada quando há soquete presente no código

Eric Santos
In reply to this post by Eric Santos
Peço desculpoas pela demora na resposta!

Realmente, testei as implementações que vocês passaram e o código funcionou perfeitamente. Como não encontrei muito conteúdo sobre o assunto na internet e a escrita estava sendo feita de forma "áutomatica" em códigos de teste que eu fiz, passei a acreditar que a escrita no arquivo era feita assim que o método fosse invocado, assim como acontece na saída padrão. Enfim, eu desconhecia todo esse conceito de buffer e a necessidade de "limpá-lo".

Enfim. No mais, tenho a agredecer pelo suporte e respostas de vocês. Sem vocês, eu estaria num loop infinito de tentativa e erro :^)

Grato.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.