2012-04-11 18 views
-1

このコードの太字部分が何をしているのか誰かに説明することができますか?Cのチャットクライアント? (Cネットワークプログラミング)

 while (1) 
    { 

    **FD_ZERO(&readfds); 
    FD_SET(0, &readfds); /* add stdin */ 
    FD_SET(sock, &readfds);** 

/* BLOCK on select() */ 
**select(FD_SETSIZE, &readfds, NULL, NULL, NULL);** 

**if (FD_ISSET(0, &readfds))** 
{ 
    char msg[1024]; 
    scanf("%[^\n]", msg); /* read everything up to the '\n' */ 
    getchar(); /* read (skip) the '\n' character */ 

    /* write the message to the socket connection */ 
    int n = write(sock, msg, strlen(msg)); 
    if (n < strlen(msg)) 
    { 
    perror("write() failed"); 
    return EXIT_FAILURE; 
    } 
} 

**if (FD_ISSET(sock, &readfds))** 
{ 
    char buffer[1024]; 
    int n = read(sock, buffer, 1024); 
    if (n < 1) 
    { 
    perror("read() failed"); 
    } 
    else 
    { 
    buffer[n] = '\0'; 
    printf("Rcvd msg from server: %s", buffer); 
    } 
} 

}

+0

ああ太字は表示されませんでしたが、あなたはそれらをダブルアスタリスクで見ることができます。 4つの部分があります。 – Aerovistae

+1

'man select'を読んだことがありますか? – Mat

+0

申し訳ありません、それを打つ。私はそれを完全に理解していませんが。私はそれについて考えている。 – Aerovistae

答えて

2

FD_の低いものは、並列に異なる「イベント」に「待機中」処理するために、ファイルディスクリプタのセットを維持するために使用されています。最初の "太字"ブロックは、標準入力とソケット(おそらく)の2つのfdでセットを初期化します。 「選択」機能は、読み込みの準備が整うと、それらの「ファイル」上でプログラムを待機させる。それらのうちの1つが準備完了状態になると、select関数はバック制御を返しますが、どの "fd"が準備完了であったかを知ることはできません。 FD_ISSETはそれを知り、ifの本体の状況を処理して何かを行うことができます(一方または両方が準備できます)。 stdinの読み込み準備が整うと、プログラムはそれを読み込み、sockに書き込みます。 sockが読み込める状態になると、プログラムはそれを読み込み、読み込んだ内容をstdoutに書き出します。

違う言い方をすれば、FD_スタッフはI/O多重化のためのものです。

関連する問題