2

私はクライアント/サーバーモデルを構築していますが、ソケットを使用し、名前付きパイプを使用し、mkfifo()を使用しています。

クライアントが名前付きパイプに出力を書き込み、次を使用してサーバーの入力を読み取ります。

while ((n = read(fd_in, &newChar, 1)) == 1) { /* ... */ }

<'CR'> <'LF'>の2つの文字に遭遇するまで、一度に1つの文字を読んでいます。しばらくしてからクライアントが<'CR'><'LF'>で終了しない場合は、コードを破棄して別のクライアントに進むことができるようにコードを作成したいと思います。そうしないと、次のクライアントが次のようになります。待つ、多分無限に。

read()の実行を終了する方法はありますか?2秒以内に戻らない場合は、読み取りを中断して、以前に読み取った文字を破棄し、もう一度読み取りを開始してください。

ご協力ありがとうございました、

ジェリー

4

3 に答える 3

4
#include <stdbool.h>
#include <poll.h>

do {
    ssize_t ret;
    struct pollfd ps = {.fd = fd_in, .events = POLLIN}; 

    if (poll(&ps, 1, 2000) < 0)
        break; /* kick client */
    ret = read(in_fd, ...);
    if (ret != 1)
        break;
    /* process read data */
} while (true);

これにより、読み取るデータがあるかどうかがチェックされます。2000ミリ秒以内にない場合は、必要な操作を行います(切断など)。

于 2011-02-08T00:26:17.673 に答える
3

FIFOの読み取り側でO_NONBLOCKフラグを渡してみてください。これにより、要求された文字数がパイプにない場合でもすぐopenに戻るように動作が変更されます。read

于 2011-02-08T00:34:03.463 に答える
1

複数のクライアントを同時に処理するには、ファイル記述子をで非ブロックに設定してから、またはをfcntl()使用して、少なくとも1つのクライアントに入力が表示されるまでブロックする必要があります。select()poll()

于 2011-02-08T01:08:04.330 に答える