• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

zecapistolas

Named pipe

7 mensagens neste tópico

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....  :thumbdown:

Será que tenho que colocar semáforos para controlar o acesso ao named pipe?!

cumps  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pelas dicas.... Vou averiguar as vossas opiniões e investigar mais um pouco....

cumps  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora