ユーザーインタラクションとソケットのイベントを同時に処理するにはどうすればよいですか?
-
28-10-2019 - |
質問
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 と チュートリアルを選択します
所属していません StackOverflow