Jump to content

Named pipe


zecapistolas
 Share

Recommended Posts

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

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

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

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.