Commit 0d379ea1 authored by captainwong's avatar captainwong

nonblocking send; disarm require user to input passwd

parent 2ff81537
...@@ -52,6 +52,18 @@ size_t clientAdemcoId = 0; ...@@ -52,6 +52,18 @@ size_t clientAdemcoId = 0;
std::mutex mutex = {}; std::mutex mutex = {};
std::vector<ADEMCO_EVENT> evntsWaiting4Send = {}; std::vector<ADEMCO_EVENT> evntsWaiting4Send = {};
char pwd[1024] = {};
int setNonBlocking(SOCKET socket)
{
u_long lngMode = 1;
int ret = ioctl(socket, FIONBIO, (u_long*)&lngMode);
if (ret != 0) {
fprintf(stderr, "ioctl failed %d\n", ret);
return ret;
}
return ret;
}
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
...@@ -79,10 +91,8 @@ int main(int argc, char** argv) ...@@ -79,10 +91,8 @@ int main(int argc, char** argv)
sAddrIn.sin_addr.s_addr = INADDR_ANY; sAddrIn.sin_addr.s_addr = INADDR_ANY;
auto serverSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); auto serverSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
u_long lngMode = 1; int ret = setNonBlocking(serverSock);
int ret = ioctl(serverSock, FIONBIO, (u_long*) & lngMode);
if (ret != 0) { if (ret != 0) {
fprintf(stderr, "ioctl failed %d\n", ret);
return ret; return ret;
} }
ret = bind(serverSock, (struct sockaddr*) & sAddrIn, sizeof(sAddrIn)); ret = bind(serverSock, (struct sockaddr*) & sAddrIn, sizeof(sAddrIn));
...@@ -114,6 +124,10 @@ int main(int argc, char** argv) ...@@ -114,6 +124,10 @@ int main(int argc, char** argv)
if (nfds > 0) { if (nfds > 0) {
FD_CLR(serverSock, &rfd); FD_CLR(serverSock, &rfd);
clientSock = accept(serverSock, (struct sockaddr*) & sForeignAddrIn, &nLength); clientSock = accept(serverSock, (struct sockaddr*) & sForeignAddrIn, &nLength);
int ret = setNonBlocking(clientSock);
if (ret != 0) {
exit(0);
}
printf("Got connection from %s:%d, fd=%lld\n", inet_ntoa(sForeignAddrIn.sin_addr), sForeignAddrIn.sin_port, clientSock); printf("Got connection from %s:%d, fd=%lld\n", inet_ntoa(sForeignAddrIn.sin_addr), sForeignAddrIn.sin_port, clientSock);
} }
}; };
...@@ -247,9 +261,17 @@ int main(int argc, char** argv) ...@@ -247,9 +261,17 @@ int main(int argc, char** argv)
char buf[1024]; char buf[1024];
AdemcoPacket ap; AdemcoPacket ap;
for (auto e : evntsWaiting4Send) { for (auto e : evntsWaiting4Send) {
auto len = ap.make_hb(buf, sizeof(buf), 1, clientAcct, clientAdemcoId, 0, e, 0); if (e == EVENT_DISARM) {
printf("S:%s\n", ap.toString().data()); auto xdata = makeXData(pwd, 6);
send(clientSock, buf, len, 0); auto len = ap.make_hb(buf, sizeof(buf), 1, clientAcct, clientAdemcoId, 0, e, 0, xdata);
printf("S:%s\n", ap.toString().data());
send(clientSock, buf, len, 0);
} else {
auto len = ap.make_hb(buf, sizeof(buf), 1, clientAcct, clientAdemcoId, 0, e, 0);
printf("S:%s\n", ap.toString().data());
send(clientSock, buf, len, 0);
}
} }
evntsWaiting4Send.clear(); evntsWaiting4Send.clear();
} }
...@@ -265,6 +287,11 @@ int main(int argc, char** argv) ...@@ -265,6 +287,11 @@ int main(int argc, char** argv)
std::lock_guard<std::mutex> lg(mutex); std::lock_guard<std::mutex> lg(mutex);
evntsWaiting4Send.push_back(EVENT_ARM); evntsWaiting4Send.push_back(EVENT_ARM);
} else if (cmd == 'd' || cmd == 'D') { } else if (cmd == 'd' || cmd == 'D') {
bool pwd_ok = false;
do {
printf("Input 6 digit password:");
scanf("%s", &pwd);
} while (strlen(pwd) != 6);
std::lock_guard<std::mutex> lg(mutex); std::lock_guard<std::mutex> lg(mutex);
evntsWaiting4Send.push_back(EVENT_DISARM); evntsWaiting4Send.push_back(EVENT_DISARM);
} else if (cmd == '\r' || cmd == '\n') { } else if (cmd == '\r' || cmd == '\n') {
...@@ -277,5 +304,6 @@ int main(int argc, char** argv) ...@@ -277,5 +304,6 @@ int main(int argc, char** argv)
} }
} }
close(serverSock);
printf("Bye!"); printf("Bye!");
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment