ユーザーインタラクションとソケットのイベントを同時に処理するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/9366176

質問

NCURSESをインターフェイスとして使用するこのチャットプログラムを作成しています。ソケットファイルの記述子とユーザーインターションを同時に処理するにはどうすればよいですか?私のアイデアは以下にあります。問題は、私が押すボタンごとに1回のみループが実行されることです。ソケットとユーザーインタラクションが準備ができたらすぐに処理されるように、プログラムを構成するにはどうすればよいですか?標準の入力と出力用のファイル記述子を投票に含めるだけで試してみましたが、それは機能しません。

while(ch = getch()) {
   poll sockets
   loop sockets {
      ...
   }
   switch(ch) {
      ...
   }
} 

また、より一般的な質問として。通常、ユーザーの相互作用やその他のことを一度に処理するプログラムをどのように作成しますか?これを行う標準的な方法があるようです。

役に立ちましたか?

解決

あなたが試すことができます nodelay() 入力画面に。

nodelay(stdscr,TRUE); // turn off getch() blocking

while(getch() == ERR)
{
    //do other stuff
}
else
    //handle input

しかし、可能性があるかもしれません。

他のヒント

stdinを含むファイル記述子セット(fd_set)と読み取ろうとしているソケットを構築し、セットでselect()を使用します。次のようなもの::

int main(int argc, char **argv)
{
  fd_set fds;
  int fd = open(/* your socket */);
  struct timeval tv;

  FD_ZERO(&fds);
  FD_SET(STDIN_FILENO, &fds);
  FD_SET(fd, &fds);

  while (1) {
     tv.tv_sec = 1; // wait for up to 1 sec
     int retval = select(2, &fds, NULL, NULL, &tv);
     if (retval > 0) {
        if (FD_ISSET(STDIN_FILENO, &fds)) 
            // process stdin
        else if (FD_ISSET(fd, &fds))
            // process data from your socket
     } else if (retval == 0) 
        // timeout
     else
        // some error
   }
   exit 0;
}

(私はこれをコンパイルしませんでしたが、あなたはアイデアを得る必要があります。)

見る fd_setチュートリアルを選択します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top