1

私はCデザインパターンにあまり精通しておらず、次の問題の最善の解決策を探しています。libpurpleをベースにした小さなチャットクライアントを書きたいです。

プログラムの実行中に、いくつかのインスタントメッセージアカウントを接続および切断できるようにしたいと思います。接続と切断の呼び出しはコマンドラインを介して渡される必要がありますが、gets()で入力を待機します。プログラムは、すでに接続されているインスタントメッセージアカウントから新しいメッセージを取得するために常に実行する必要があるため、解決策はありません。

4

2 に答える 2

2

おそらく、イベントの処理にpoll(またはselect)を使用することをお勧めします。したがって、接続を確立した後、ファイル記述子があり、さらに、OSからのファイル記述子(つまり0)もある標準入力があり、それらすべてのファイル記述子をに渡すことができます。これにより、ファイル記述子pollが通知されます。いずれかのファイル記述子の受信データです。コード例:

/* fd1, fd2 are sockets */
while(1) {
    pollfd fds[3];
    int ret;

    fds[0].fd = fd1;
    fds[1].fd = fd2;
    fds[2].fd = STDIN_FILENO;
    fds[0].events = POLLIN;
    fds[1].events = POLLIN;
    fds[2].events = POLLIN;
    ret = poll(fds, 3, -1); /* poll() blocks, but you can set a timeout here */
    if(ret < 0) {
        perror("poll");
    }
    else if(ret == 0) {
        printf("timeout\n");
    }
    else {
        if(fds[0].revents & POLLIN) {
            /* incoming data from fd1 */
        }
        if(fds[0].revents & (POLLERR | POLLNVAL)) {
            /* error on fd1 */
        }
        if(fds[1].revents & POLLIN) {
            /* incoming data from fd2 */
        }
        if(fds[1].revents & (POLLERR | POLLNVAL)) {
            /* error on fd2 */
        }
        if(fds[2].revents & POLLIN) {
            /* incoming data from stdin */
            char buf[1024];
            int bytes_read = read(STDIN_FILENO, buf, 1024);
            /* handle input, which is stored in buf */
        }
    }
}

あなたはOSについて言及しませんでした。これはPOSIX(OS X、Linux、Windows with mingw)で機能します。Win32 APIを使用する必要がある場合、外観は少し異なりますが、原則は同じです。

于 2011-10-07T12:09:34.370 に答える
0

select(2)をチェックしてください。libpurpleがどのように機能するかはよくわかりませんが、ファイル記述子(ファイルやソケットなど)を介した通知が許可されている場合は、selectが解決策です。

pthread_create(3)を使用して別のスレッドを作成することもできます。そうすれば、プログラムの残りの部分がそれを実行している間、get(または何でも)をブロックできます。

于 2011-10-07T12:10:29.230 に答える