zecapistolas Posted November 17, 2009 at 09:43 PM Report Share #296724 Posted November 17, 2009 at 09:43 PM Boas Pessoal, Tenho uma aplicação Cliente e uma aplicação Servidor que comunicam através de named pipe , pois bem, eles comunicam.... 😉 Em traços gerais tenho isto: Cliente.c /* open named pipe */ /* write no named pipe */ /* close named pipe*/ Servidor.c /* criar o named pipe */ while (1) { /* ler do named pipe */ } Mas o problema é o seguinte, o Servidor como está em ciclo infinito mal o Cliente escreve qualquer coisa no named pipe o Servidor lê logo e depois como o Cliente não teve tempo de escrever tudo, o Servidor também não lê tudo.... ? Será que tenho que colocar semáforos para controlar o acesso ao named pipe?! cumps 😉 Link to comment Share on other sites More sharing options...
IceBrain Posted November 18, 2009 at 12:05 AM Report Share #296737 Posted November 18, 2009 at 12:05 AM Ou isso, ou implementas um "protocolo". Por exemplo, antes de enviar uma mensagem, o Cliente pode enviar um int com o tamanho da mensagem em bytes. Depois o Servidor só que fazer: 1- Lê um int para a variável L 2- Lê "L" bytes e guarda no buffer / processa 3- goto 1 😉 (quanto eu digo "goto", pode ser no while, não é preciso usar gotos 😉) ❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents A list of command line apps Link to comment Share on other sites More sharing options...
zecapistolas Posted November 18, 2009 at 11:21 AM Author Report Share #296755 Posted November 18, 2009 at 11:21 AM Ou isso, ou implementas um "protocolo". Por exemplo, antes de enviar uma mensagem, o Cliente pode enviar um int com o tamanho da mensagem em bytes. Essa mensagem seria enviada como, através de pipes sem nome (pipes normais)?! cumps 😉 Link to comment Share on other sites More sharing options...
M6 Posted November 18, 2009 at 12:34 PM Report Share #296764 Posted November 18, 2009 at 12:34 PM Ou então defines um char especifico como fim de mensagem, ou até algo "à lá xml", tipo "<msgs>sdfgdrg<msg>". Vais juntado os chars que te vão chegando e analisando a concatenação do conteúdo de forma a saberes se já tens uma mensagem completa. 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to comment Share on other sites More sharing options...
IceBrain Posted November 18, 2009 at 04:56 PM Report Share #296777 Posted November 18, 2009 at 04:56 PM Essa mensagem seria enviada como, através de pipes sem nome (pipes normais)?! cumps 😉 Não, a mensagem é aquilo que tu mandas actualmente. Imagina que queres mandar a string "teste". Exemplo: char buffer[10] = "teste"; int size = sizeof(buffer); //Enviar o tamanho da mensagem fprintf(PIPE, "%d", size); //Enviar a mensagem fwrite (buffer , 1 , size, PIPE ); O destinatário só tem que ler o int, e depois copiar "N" bytes: int size; char * buffer; fread(&size, sizeof(int), 1, PIPE); //ok, a mensagem ocupa "size" bytes, vamos ler: buffer = malloc(size); fread(buffer, 1, size, PIPE); Isto é mais ou menos como funcionam vários protocolos como o HTTP: Têm um header fixo que tem uma indicação do tamanho do "corpo" da mensagem (no caso do HTTP é a Content-Length). Isto é mais eficiente que a solução do M6, AFAIK, porque o outro processo pode simplesmente fazer uma cópia do pipe em vez de ter que processar cada byte que chega. Além disso, há sempre o problema de no próprio corpo da mensagem poder haver um pedaço de texto/bytes que sejam iguais ao delimitador. A desvantagem deste sistema em relação ao do M6 é que precisas de saber o tamanho de cada mensagem antes da enviar, o que nem sempre é possível. ❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents A list of command line apps Link to comment Share on other sites More sharing options...
zecapistolas Posted November 18, 2009 at 11:28 PM Author Report Share #296839 Posted November 18, 2009 at 11:28 PM Obrigado pelas dicas.... Vou averiguar as vossas opiniões e investigar mais um pouco.... cumps 😉 Link to comment Share on other sites More sharing options...
zecapistolas Posted December 12, 2009 at 07:12 PM Author Report Share #300064 Posted December 12, 2009 at 07:12 PM Viva, Tenho dois processos a abrir um determinado NamedPipe. o problema é que de vez em quando um dos processos não lê correctamente o seu conteúdo.... Tenho a certeza que o Processo A escreve correctamente no NamedPipe, mas o Processo B não lê correctamente.... Que tipo de problema pode causar esta situação?! cumps 😉 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now