#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