#include "main.h" void print_data(Data *data) { printf("TYPE: %d\n", data->type); if (data->request != 0) printf("REQUEST: %d\n", data->request); if (data->response != 0) printf("RESPONSE: %d\n", data->response); if (data->hostname != NULL) printf("HOSTNAME: %s\n", data->hostname); } bool parse_data(char *buf, Data *data) { Jimp jimp = {0}; jimp.start = buf; jimp.end = buf + strlen(buf); jimp.point = buf; if (!jimp_object_begin(&jimp)) return false; while (jimp_object_member(&jimp)) { if (strcmp(jimp.string, "TYPE") == 0) { if (!jimp_number(&jimp)) return false; data->type = jimp.number; } else if (strcmp(jimp.string, "REQUEST") == 0) { if (jimp__get_and_expect_token(&jimp, JIMP_NULL)) continue; if (!jimp_number(&jimp)) return false; data->request = jimp.number; } else if (strcmp(jimp.string, "RESPONSE") == 0) { if (jimp__get_and_expect_token(&jimp, JIMP_NULL)) continue; if (!jimp_number(&jimp)) return false; data->response = jimp.number; } else if (strcmp(jimp.string, "HOSTNAME") == 0) { if (jimp__get_and_expect_token(&jimp, JIMP_NULL)) continue; if (!jimp_string(&jimp)) return false; data->hostname = jimp.string; } } print_data(data); return true; }; int main(void) { const int fd = socket(PF_INET, SOCK_STREAM, 0); struct sockaddr_in addr = { 0 }; addr.sin_family = AF_INET; addr.sin_port = htons((short) PORT); // connect to local machine at specified port char addrstr[NI_MAXHOST + NI_MAXSERV + 1]; snprintf(addrstr, sizeof(addrstr), "127.0.0.1:%d", PORT); // parse into address inet_pton(AF_INET, addrstr, &addr.sin_addr); // connect to server if (connect(fd, (struct sockaddr*) &addr, sizeof(addr))) { perror("failed to connect"); return 1; } char hostname[HOST_NAME_MAX]; int res = gethostname(hostname, HOST_NAME_MAX); if (res != 0) { perror("ERROR: failed to get hostname"); return 1; } Jim jim = {.pp = 4}; jim_object_begin(&jim); jim_member_key(&jim, "TYPE"); jim_integer(&jim, REQUEST); jim_member_key(&jim, "REQUEST"); jim_integer(&jim, NEW_SERVER_CLIENT); jim_member_key(&jim, "HOSTNAME"); jim_string(&jim, hostname); jim_object_end(&jim); printf("sending initial request to server\n"); send(fd, jim.sink, jim.sink_count, 0); char buf[MAX_MESSAGE_SIZE]; res = recv(fd, buf, MAX_MESSAGE_SIZE, 0); if (res == -1) { fprintf(stderr, "ERROR: failed to receive message from server\n"); return 1; } printf("%s\n", buf); Data data = {0}; parse_data(buf, &data); if (data.type != RESPONSE) { fprintf(stderr, "ERROR: server didn't send a result, exiting...\n"); close(fd); exit(1); } else if (data.response == ERROR) { fprintf(stderr, "ERROR: server encounted error, exiting...\n"); close(fd); exit(1); } printf("connected to server\n"); while (true) { sleep(INTERVAL); } close(fd); return 0; }