void monitor_init(void) { struct sockaddr_in addr; socklen_t len; sbuf = msgpack_sbuffer_new(); draw_sbuf = msgpack_sbuffer_new(); up = msgpack_unpacker_new(MONITOR_BUF_SIZE); /* TCP socket */ sock_listen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); addr.sin_family = AF_INET; addr.sin_port = htons(MONITOR_PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY); bind(sock_listen, (struct sockaddr *)&addr, sizeof(addr)); printf("[System] Waiting monitor connection... \n"); listen(sock_listen, 1); len = sizeof(addr_client); sock = accept(sock_listen, (struct sockaddr *)&addr_client, &len); printf("[System] Monitor connected %s\n", inet_ntoa(addr_client.sin_addr)); }
void unpack(receiver* r) { /* buf is allocated by unpacker. */ msgpack_unpacker* unp = msgpack_unpacker_new(100); msgpack_unpacked result; msgpack_unpack_return ret; size_t recv_len; int recv_count = 0; int i = 0; msgpack_unpacked_init(&result); while (true) { recv_len = receiver_to_unpacker(r, EACH_RECV_SIZE, unp); if (recv_len == 0) break; // (reached end of input) printf("receive count: %d %zd bytes received.\n", recv_count++, recv_len); ret = msgpack_unpacker_next(unp, &result); while (ret == MSGPACK_UNPACK_SUCCESS) { msgpack_object obj = result.data; /* Use obj. */ printf("Object no %d:\n", ++i); msgpack_object_print(stdout, obj); printf("\n"); /* If you want to allocate something on the zone, you can use zone. */ /* msgpack_zone* zone = result.zone; */ /* The lifetime of the obj and the zone, */ ret = msgpack_unpacker_next(unp, &result); } if (ret == MSGPACK_UNPACK_PARSE_ERROR) { printf("The data in the buf is invalid format.\n"); msgpack_unpacked_destroy(&result); return; } } msgpack_unpacked_destroy(&result); msgpack_unpacker_free(unp); }