static void server_process(int max, fd_set* set) { msg_group_t* group; struct iphdr* ipHdr; vector_t v; vector_functor_t f = { vector_dummy_dup, NULL }; if (!this.use_udp && FD_ISSET(this.remotefd, set)) accept_and_check(); vector_init(&v, f); if (this.use_udp) { if (FD_ISSET(this.remotefd, set)) udp_process(&v); } else tcp_process(set, &v); ++this.msg_ttl; remove_clients(&v, "closed"); vector_free(&v); if (LOCAL_HAVE_DATA(set)) { unsigned char buffer[2048]; ssize_t readen = 0; #ifdef WIN32 ReadFile(this.localfd, buffer, sizeof(buffer), &readen, NULL); #else readen = read(this.localfd, buffer, sizeof(buffer)); #endif if (readen > 0) { ssize_t idx; ipHdr = (struct iphdr*)buffer; idx = active_vector_lookup(&this.clients, compare_clients_by_local_ip, (void*)(long)ipHdr->daddr, sizeof(ipHdr->daddr)); if (idx >= 0) { client_t* client; size_t len; active_vector_get(&this.clients, idx, (void**)&client, &len); group = new_msg_group(buffer, (unsigned short)readen); if (group) { ssize_t written = send_msg_group(client, group); msg_group_free(group); SYSLOG(LOG_INFO, "send msg length: %ld", written); } } } } }
void msg_group_free_hash_val(void* val, size_t len) { msg_group_free(val); }
void msg_group_free_hash(void* key, size_t key_len, void* val, size_t val_len) { msg_group_free(val); }