summaryrefslogtreecommitdiffstats
path: root/src/server/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/main.c')
-rw-r--r--src/server/main.c91
1 files changed, 23 insertions, 68 deletions
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 <stddef.h>
#include <stdlib.h>
#include <time.h>
+#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;
}