Thursday, November 19, 2015

UDP Server - 19 Nov 2015

/* Creates a datagram server.  The port
   number is passed as an argument.  This
   server runs forever */

#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
insert (
    int    m,
    int    u
) {
    db[m][u]    = 1;
}




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





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




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

const    int    BUF_SIZE    = 1024;


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);
   for (;;) {
           ok    = 1;
        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) || (u > 1000000)) continue;
       
        switch (buf[0]) {
            case 'I':
                insert(m, u);
                break;
            case 'D':
                delete(m, u);
                break;
            case 'L':
                ok    = lookup(m, u);
        }
        buffer[0] = '0' + ok;
        n    = sendto(sock, buffer, 1, (struct sockaddr *)&from, fromlen);
       if (n < 0) error("sendto");
   }
 }

No comments:

Post a Comment