From 955c96410a10cbba1999df658404fcdbcdee0ee3 Mon Sep 17 00:00:00 2001 From: Gediminas Jakutis Date: Tue, 17 Apr 2018 13:04:42 +0300 Subject: server: split away networking code. --- src/server/main.c | 91 ++++++++++++++----------------------------------------- 1 file changed, 23 insertions(+), 68 deletions(-) (limited to 'src/server/main.c') diff --git a/src/server/main.c b/src/server/main.c index 8e4f413..1b36c2f 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -31,99 +31,54 @@ #include #include #include +#include "net.h" -static void init(const unsigned int port, int *sock); -static int getpacket(char *data, size_t buffsize, int *sock, struct sockaddr_in *sender); +static struct netstate *init(const unsigned int port); static void draw_idle(void); static void draw_busy(const char * const data); static float digest_temp(const short int rawdata); int main(void) { - static const char servermagic[] = "I love coffee!"; - static const char clientmagic[] = "I love tea!"; - struct sockaddr_in srvaddr = {0}; - char buff[9001] = {0}; - int sock; - int pstatus; - struct timespec lastreply; - struct timespec now; + struct netstate *state; + char data[8] = {0}; + int status; + struct timespec wait = {0, 500 * 1000 * 1000}; - init(2191, &sock); - - clock_gettime(CLOCK_MONOTONIC_RAW, &now); - lastreply = now; - lastreply.tv_sec -= 5; + state = init(2191); do { - clock_gettime(CLOCK_MONOTONIC_RAW, &now); - pstatus = getpacket(buff, sizeof(buff), &sock, &srvaddr); - - switch (pstatus) { - case 0: - if ((now.tv_sec - lastreply.tv_sec) >= 5) { - draw_idle(); - } - break; - case 1: - lastreply = now; - if (buff[0] == 'I') { - if (!(strcmp(buff, servermagic))) { - sendto(sock, clientmagic, sizeof(clientmagic), - MSG_DONTWAIT, (struct sockaddr *) &srvaddr, sizeof(srvaddr)); - } - draw_idle(); - continue; - } - draw_busy(buff); + status = state->getlastdata(data, state); + switch (status) { + case NET_OK: + /*fall-through */ + case NET_NONEWDATA: + draw_busy(data); break; + case NET_ERROR: + goto fail; default: + draw_idle(); ; /* noop */ } - } while (getch() != 'q' && pstatus >= 0); + nanosleep(&wait, NULL); + } while (getch() != 'q'); - close(sock); +fail: + net_close(&state); endwin(); return 0; } -static void init(const unsigned int port, int *sock) +static struct netstate *init(const unsigned int port) { - struct sockaddr_in bindaddress = {0}; - - bindaddress.sin_family = AF_INET; - bindaddress.sin_port = htons(port); - *sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - bind(*sock, (struct sockaddr*) &bindaddress, sizeof(bindaddress)); + struct netstate *ret; + ret = net_init(port); initscr(); nodelay(stdscr, 1); noecho(); -} - -static int getpacket(char *data, size_t buffsize, int *sock, struct sockaddr_in *sender) -{ - static struct pollfd pfd = {0}; - int ret; - socklen_t sender_len = sizeof(*sender); - - if (!pfd.fd) { - pfd.fd = *sock; - pfd.events = POLLIN; - pfd.revents = 0; - } - - ret = poll(&pfd, 1, 25); - if (ret <= 0) { - return ret; - } - if (pfd.revents & POLLIN) { - recvfrom(*sock, data, buffsize, MSG_DONTWAIT, (struct sockaddr *) sender, &sender_len); - ret = 1; - } else { - ret = 0; - } return ret; } -- cgit v1.2.3