在wifidog啟動過程中,我們可能會經常看到這種log:
Auth server did NOT say pong!
這個debug信息是再告訴我們,wifidog的ping協議沒有收到來自auth server 的pong 回應。
首先解釋下什么是ping協議。這種協議是路由器用來告訴auth server 路由器當前的狀態,協議格式:
http://auth_server/ping/?gw_id=xxx&sys_uptime=xxx&sys_memfree&sys_load=xxx&wifidog_uptime=xxx
gw_id是路由器的標識符,sys_uptime是路由器啟動時間,sys_memfree是路由器的內存剩余,sys_load是系統負載,wifidog_uptime是wifidog啟動時間,路由器將這些信息發送給auth server,server 回"Pong" 來表示server知道這臺路由器還在工作。
下面是出現上述log的代碼:
do {
FD_ZERO(&readfds);
FD_SET(sockfd, &readfds);
timeout.tv_sec = 30; /* XXX magic... 30 second */
timeout.tv_usec = 0;
nfds = sockfd + 1;
nfds = select(nfds, &readfds, NULL, NULL, &timeout);
if (nfds > 0) {
/** We don't have to use FD_ISSET() because there
*? was only one fd. */
numbytes = read(sockfd, request + totalbytes, MAX_BUF - (totalbytes + 1));
if (numbytes < 0) {
debug(LOG_ERR, "An error occurred while reading from auth server: %s", strerror(errno));
/* FIXME */
close(sockfd);
return;
}
else if (numbytes == 0) {
done = 1;
}
else {
totalbytes += numbytes;
debug(LOG_DEBUG, "Read %d bytes, total now %d", numbytes, totalbytes);
}
}
else if (nfds == 0) {
debug(LOG_ERR, "Timed out reading data via select() from auth server");
/* FIXME */
close(sockfd);
return;
}
else if (nfds < 0) {
debug(LOG_ERR, "Error reading data via select() from auth server: %s", strerror(errno));
/* FIXME */
close(sockfd);
return;
}
} while (!done);
close(sockfd);
debug(LOG_DEBUG, "Done reading reply, total %d bytes", totalbytes);
request[totalbytes] = '\0';
debug(LOG_DEBUG, "HTTP Response from Server: [%s]", request);
if (strstr(request, "Pong") == 0) {
debug(LOG_WARNING, "Auth server did NOT say pong!");
/* FIXME */
}
else {
debug(LOG_DEBUG, "Auth Server Says: Pong");
}
這段log 出現在wifidog 在接收server 的響應包里沒有出現Pong字符串。
本文章由?http://www.wifidog.pro/2015/02/25/wifidog%E7%9A%84ping%E5%8D%8F%E8%AE%AE.html?整理編輯,轉載請注明出處