Monday, December 14, 2015

server.c - Dr. Mayhew 12/14/2015

#include <sys/types.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <netdb.h>
#include <stdio.h>


char    db[100][1000000];


void    error    (const char*    msg)    {perror(msg); exit(0); }


const    int    BUF_SIZE    = 1024;
char    db[100][1000000];





int
lookup (
    int    m,
    int    u
) {
    return db[m][u];
}

void
insert (
    int    m,
    int    u
) {
    db[m][u]    = 1;
}

void
delete (
    int    m,
    int    u
) {
    db[m][u]    = 0;
}



void
db_load (
) {
    FILE*    q;
    int        m;
    int        u;

    q    = fopen("george", "r");
    if (q) {
        while(fscanf(q, "%d %d", &m, &u) != EOF) {
            if ((m < 100) && (u < 1000000)) {
                insert(m, u);
            }
        }
        fclose(q);
    }
}



void
db_store (
) {
    FILE*    q;
    int        i;
    int        j;

    q    = fopen("george", "w");
    for (i = 0; i < 100; ++i) {
        for (j = 0; j < 1000000; ++j) {
            if (lookup(i, j))    fprintf(q, "%d %d\n", i, j);
        }
    }
    fclose(q);
}




int
main (
    int        argc,
    char*    argv[]
) {
   int                    sock;
   int                    length;
   int                    n;
   socklen_t            fromlen;
   struct sockaddr_in    server;
   struct sockaddr_in    from;
   char                    buf[BUF_SIZE];
   char                    buffer[BUF_SIZE];

    int        m;
    int        u;
    int        ok;

   if (argc != 2)    error("ERROR, no port provided\n");
  
   sock        = socket(AF_INET, SOCK_DGRAM, 0);
   if (sock < 0) error("Opening socket");

   length    = sizeof(server);
   bzero(&server, length);
   server.sin_family        = AF_INET;
   server.sin_addr.s_addr    = INADDR_ANY;
   server.sin_port            = htons(atoi(argv[1]));

   if (bind(sock,(struct sockaddr *)&server,length) < 0) error("binding");
   fromlen    = sizeof(struct sockaddr_in);
   db_load();
   for (;;) {
           ok    = 0;
        n    = recvfrom(sock, buf, BUF_SIZE, 0, (struct sockaddr *)&from, &fromlen);
        if (n < 0) error("recvfrom");

        buf[n] = 0;
        sscanf(buf + 2, "%d %d", &m, &u);
        if (m > 99) {
            if (u > 1000000)    ok    = 5;
            else                ok    = 3;
        }
        else if (u > 1000000)    ok    = 4;
        else {
            switch (buf[0]) {
                case 'I':
                    insert(m, u);
                    db_store();
                    break;
                case 'D':
                    delete(m, u);
                    db_store();
                    break;
                case 'L':
                    ok    = !lookup(m, u);
                    break;
                default:
                    ok    = 2;
            }
        }
        buffer[0] = '0' + ok;
        n    = sendto(sock, buffer, 1, 0, (struct sockaddr *)&from, fromlen);
       if (n < 0) error("sendto");
   }
 }

No comments:

Post a Comment