ここで本当に探しているものはわかりません。これを単純にコーディングするのはかなり簡単ですが、この問題は私にとってfull-blown FSM table-driven approachに見合うようには見えません。
ここではいくつかのCのような擬似コードは次のとおりです。
double pc = 0.01;
int sensorsfd;
void loop(void) {
for (;;) {
fd_set readfds, writefds, exceptfds;
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_ZERO(&exceptfds);
FD_SET(sensorsfd, &readfds);
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 1; /* 0.001 seconds */
int r;
send_polling_packet();
r = select(sensorsfd+1, &readfds, &writefds, &exceptfds, &tv);
if (r == -1 && errno == EINTR) {
continue;
} else if (r == -1) {
perror("select() failed");
exit(1);
} else if (r == 0) {
/* timeout expired */
pc = min (pc + 0.01, 1.0);
} else if (r == 1) {
/* sensorsfd won't block when reading it */
packet_t p = read_packet(sensorsfd);
/* should also handle _no packet_ if the sensors
socket returns EOF */
if (packet_corrupted(p)) {
pc /= 2;
} else {
handle_packet(p);
}
} else {
/* error in program logic */
}
}
}
擬似コード私はちょうどこれを書いて にそれをテストするためのメカニズムを持っていないという意味で。あなたのプログラムがこれよりもはるかに複雑になるなら、おそらく はselect(2)
の設定をそれ自身の機能にカプセル化し、 センサーのソケットからのパケットを処理するすべての詳細をカプセル化したいでしょう。
タイトルは吸いますが、元々のものより優れています。それを改善してください。私はネットワーキングについてよく知らないので、あなたに任せます。 –