2016-06-19 14 views
1

私は要求に応じてキャプチャ画像を作成するサーバーを持っています。名前付きパイプクライアントの識別方法

クライアントは、6つのチャットワードとIDを持つ名前付きパイプ経由でサーバーと通信します。

サーバーはイメージを作成し、名前付きパイプ経由でクライアントに送信します。

クライアントには、サーバと通信して結果を取得してword.pngファイルに保存するcreate_captcha_files(const char * word)関数があります。

サーバには、対応するイメージをバッファに書き込む、すでに実装された関数size_t captcha(const char * word、char * buffer)があり、最大16384バイトの書き込みバイト数を返します。

ので、クライアントはこのようなものです:

#include <fcntl.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <unistd.h> 


int main() 
{ 
    int fd, fdin, fdpng; 
    char * myfifo = "captcha"; 
    char id = "001"; 
    char text[9]; 
    char buf[1024]; 
    char png[10]; 
    char palavra[6]; 


create_captcha_file(const char* palavra) { 
    //write to fifo "captcha" the word + id 
    mkfifo(myfifo, 0666); 
    strcat(strcat(text,palavra),id); 
    fd = open(myfifo, O_WRONLY); 
    write(fd,text,9): 
    close(fd); 
    unlink(myfifo); 

    //read anwser from server 
    mkfifo(id,0666); 
    fdin = open(id,O_RDONLY); 
    strcat(strcat(png,palavra),".png"); 
    //create the .png file 
    int fdpng = open(id,O_WRONLY | O_CREAT | O_APPEND,S_IRWXU); 
     while((read(fdin,buf,1))) 
      { 
      write(fdpng,buf,1); 
      } 
     close(fdpng); 
     close(fdin); 
    } 
    unlink(id); 


    return 0; 
} 

とサーバー:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/stat.h> 

int main() 
{ 


    int fd; 
    char texto[9]; 
    char palavra[6]; 
    char id[3]; 
    char * myfifo = "captcha"; 
    buffer[16384]; 

    //create and read from fifo 
    mkfifo(myfifo, 0666); 
    fdin = open(myfifo, O_RDONLY); 
    read(fdin, texto, 9); 
    close(fdin); 
    //separate word from id 
    for(i=0;i<=9;i++) { 
     if(i<7) strcat(palavra,texto[i]) 
     else strcat(id,texto[i] 
    } 

size_t captcha(const *char palavra, char * buffer) { 
    //create the captcha image and save to buffer 
    buffer = create_captcha(palavra); 
    return(size_of(buffer)); 

    } 
    captcha(palavra, buffer); 

    //write to pipe id the image 
    mkfifo(id, 0666); 
    fd = open(id, O_WRONLY); 
    write(fd,buffer,size_of(buffer)): 
    close(fd); 
    unlink(fd); 

} 

答えて

1

あなたは、複数のファイル記述子に起こるために何かを待つselect()を使用し、把握するFD_ISSET()を使用することができますどのファイル記述子がメッセージを送信したか。例えば

fd_set read_set; 
FD_ZERO (&read_set); 
FD_SET (filedes[0], &read_set); /* filedes[0] is read end of the pipe */ 
FD_SET (STDIN_FILENO, &read_set); /* some other file descriptor */ 

あなたは、クライアントごとにFD_SET()を使用します。そして、クライアントを待つselectを使用します。

if (select (nfds, &read_set, NULL, NULL, NULL) == -1) 
       /* Handle error */ 

トリッキーなことがここnfdsで、それはファイルの最大は、今のIDS + 1

を記述子され、あなたは、クライアント/ file_descriptorが送られ確認することwan'tメッセージ? FD_ISSET()を使用してください!

if (FD_ISSET (filedes[0], &read_set)) 
       /* Do something */ 
if (FD_ISSET (STDIN_FILENO, &read_set)){ 
       /* Do something */ 

注:あなたは各ファイルディスクリプタ/クライアント用FD_ISSET()を使用する必要があります。

ご不明な点がございましたら、お気軽にお問い合わせください。

+0

select()は私のクラスで使用されていないので使用しないでください(少なくとも現時点で)これは簡単な方法ではありませんか? クライアントのIDを使用していない場合、クライアントは接続を待っている間にパイプを開いたままでいる必要がありますか? –

+0

さて、あなたはクライアントのファイル記述子を追加し、次にread()システムコールを使って各ファイル記述子に何かがあるかどうかをチェックしながら(1)ループチェックを行う大きな配列を使うことができます。 –

関連する問題