我不確定你真的在這裏尋找什麼;編碼這將是非常簡單的,這個問題看起來不像是我應得的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)
設置封裝到它自己的函數中,並且可能需要處理來自傳感器套接字的數據包的所有細節。
標題很爛,但它比你原來的要好。請改善它;我對網絡不太瞭解,所以我會把它留給你。 – 2011-12-14 01:16:46