uint16_t proto_receive(proto_t** p, sock_t* s) { proto_t* self = *p; uint32_t rc; if(self == NULL) { self = init(); *p = self; } while(true) { rc = sock_read(s); if(check_for_message(self, s)) return get_message_type(self); if(rc & (ASIO_ERROR | ASIO_WOULDBLOCK)) break; } return PROTO_NOP; }
void WorldWindow::agent_timer(void) { if(is_paused || sock < 0) return; try { remove_dead_agents(); transmit_senses(myPort); check_for_message(sock, myPort); } catch (...) { printf("world error in timer\n"); } }
static status_t process_pending_ici(int32 currentCPU) { mailbox_source sourceMailbox; struct smp_msg* msg = check_for_message(currentCPU, sourceMailbox); if (msg == NULL) return B_ENTRY_NOT_FOUND; TRACE((" cpu %ld message = %ld\n", currentCPU, msg->message)); bool haltCPU = false; switch (msg->message) { case SMP_MSG_INVALIDATE_PAGE_RANGE: arch_cpu_invalidate_TLB_range(msg->data, msg->data2); break; case SMP_MSG_INVALIDATE_PAGE_LIST: arch_cpu_invalidate_TLB_list((addr_t*)msg->data, (int)msg->data2); break; case SMP_MSG_USER_INVALIDATE_PAGES: arch_cpu_user_TLB_invalidate(); break; case SMP_MSG_GLOBAL_INVALIDATE_PAGES: arch_cpu_global_TLB_invalidate(); break; case SMP_MSG_CPU_HALT: haltCPU = true; break; case SMP_MSG_CALL_FUNCTION: { smp_call_func func = (smp_call_func)msg->data_ptr; func(msg->data, currentCPU, msg->data2, msg->data3); break; } case SMP_MSG_RESCHEDULE: { cpu_ent* cpu = thread_get_current_thread()->cpu; cpu->invoke_scheduler = true; cpu->invoke_scheduler_if_idle = false; break; } case SMP_MSG_RESCHEDULE_IF_IDLE: { cpu_ent* cpu = thread_get_current_thread()->cpu; if (!cpu->invoke_scheduler) { cpu->invoke_scheduler = true; cpu->invoke_scheduler_if_idle = true; } break; } default: dprintf("smp_intercpu_int_handler: got unknown message %" B_PRId32 "\n", msg->message); break; } // finish dealing with this message, possibly removing it from the list finish_message_processing(currentCPU, msg, sourceMailbox); // special case for the halt message if (haltCPU) debug_trap_cpu_in_kdl(currentCPU, false); return B_OK; }
int recv_message(char *buf, int size, int inv_trans, struct sipsak_delay *sd, struct sipsak_sr_time *srt, struct sipsak_counter *count, struct sipsak_con_data *cd, struct sipsak_regexp *reg) { int ret = 0; int sock = 0; double tmp_delay; #ifdef HAVE_INET_NTOP struct sockaddr_in peer_adr; socklen_t psize = sizeof(peer_adr); #endif #ifdef RAW_SUPPORT struct sockaddr_in faddr; struct ip *r_ip_hdr, *s_ip_hdr; struct icmp *icmp_hdr; struct udphdr *udp_hdr; size_t r_ip_len, s_ip_len, icmp_len; int srcport, dstport; unsigned int flen; #endif if (cd->buf_tmp) { buf = cd->buf_tmp; size = size - cd->buf_tmp_size; } sock = check_for_message(buf, size, cd, srt, count, sd); if (sock <= 1) { return -1; } #ifdef RAW_SUPPORT if (sock != rawsock) { #else else { #endif check_socket_error(sock, size); ret = recvfrom(sock, buf, size, 0, NULL, 0); } #ifdef RAW_SUPPORT else { /* lets check if the ICMP message matches with our sent packet */ flen = sizeof(faddr); memset(&faddr, 0, sizeof(struct sockaddr)); ret = recvfrom(rawsock, buf, size, 0, (struct sockaddr *)&faddr, &flen); if (ret == -1) { perror("error while trying to read from icmp raw socket"); exit_code(2); } r_ip_hdr = (struct ip *) buf; r_ip_len = r_ip_hdr->ip_hl << 2; icmp_hdr = (struct icmp *) (buf + r_ip_len); icmp_len = ret - r_ip_len; if (icmp_len < 8) { if (verbose > 1) printf(": ignoring (ICMP header length below 8 bytes)\n"); return -2; } else if (icmp_len < 36) { if (verbose > 1) printf(": ignoring (ICMP message too short to contain IP and UDP header)\n"); return -2; } s_ip_hdr = (struct ip *) ((char *)icmp_hdr + 8); s_ip_len = s_ip_hdr->ip_hl << 2; if (s_ip_hdr->ip_p == IPPROTO_UDP) { udp_hdr = (struct udphdr *) ((char *)s_ip_hdr + s_ip_len); srcport = ntohs(udp_hdr->uh_sport); dstport = ntohs(udp_hdr->uh_dport); #ifdef DEBUG printf("\nlport: %i, rport: %i\n", lport, rport); #endif if ((srcport == lport) && (dstport == rport)) { printf(" (type: %u, code: %u)", icmp_hdr->icmp_type, icmp_hdr->icmp_code); #ifdef HAVE_INET_NTOP if (inet_ntop(AF_INET, &faddr.sin_addr, &source_dot[0], INET_ADDRSTRLEN) != NULL) printf(": from %s\n", source_dot); else printf("\n"); #else printf("\n"); #endif // HAVE_INET_NTOP exit_code(3); } else { if (verbose > 2) printf(": ignoring (ICMP message does not match used ports)\n"); return -2; } } else { if (verbose > 1) printf(": ignoring (ICMP data is not a UDP packet)\n"); return -2; } } #endif // RAW_SUPPORT if (ret > 0) { *(buf+ ret) = '\0'; if (transport != SIP_UDP_TRANSPORT) { if (verbose > 0) printf("\nchecking message for completness...\n"); if (complete_mes(buf, ret) == 1) { cd->buf_tmp = NULL; ret += cd->buf_tmp_size; cd->buf_tmp_size = 0; } else { if (cd->buf_tmp) { cd->buf_tmp += ret; cd->buf_tmp_size += ret; } else { cd->buf_tmp = buf + ret; cd->buf_tmp_size = ret; } cd->dontsend = 1; ret = -1; } } /* store the biggest delay if one occured */ if (srt->delaytime.tv_sec != 0) { tmp_delay = deltaT(&(srt->delaytime), &(srt->recvtime)); if (tmp_delay > sd->big_delay) sd->big_delay = tmp_delay; if ((sd->small_delay == 0) || (tmp_delay < sd->small_delay)) sd->small_delay = tmp_delay; srt->delaytime.tv_sec = 0; srt->delaytime.tv_usec = 0; } if (timing > 0) { tmp_delay = deltaT(&(srt->sendtime), &(srt->recvtime)); if (tmp_delay > sd->big_delay) sd->big_delay = tmp_delay; if ((sd->small_delay == 0) || (tmp_delay < sd->small_delay)) sd->small_delay = tmp_delay; sd->all_delay += tmp_delay; } #ifdef HAVE_INET_NTOP if ((verbose > 2) && (getpeername(sock, (struct sockaddr *)&peer_adr, &psize) == 0) && (inet_ntop(peer_adr.sin_family, &peer_adr.sin_addr, &source_dot[0], INET_ADDRSTRLEN) != NULL)) { printf("\nreceived from: %s:%s:%i\n", transport_str, source_dot, ntohs(peer_adr.sin_port)); } else if (verbose > 1 && trace == 0 && usrloc == 0) printf(":\n"); #else if (trace == 0 && usrloc == 0) printf(":\n"); #endif // HAVE_INET_NTOP if (!inv_trans && ret > 0 && (regexec(&(reg->proexp), buf, 0, 0, 0) != REG_NOERROR)) { sd->retryAfter = SIP_T1; } } else { check_socket_error(sock, size); printf("nothing received, select returned error\n"); exit_code(2); } return ret; }
int main (int argc, char * argv[]) { worldportstr << worldPort; if(argc<2) return 1; genome_file = argv[1]; if(!genome_file) return 1; myGenome.attachFile(genome_file); if(argc>2) myPort=atoi(argv[2]); portstr << myPort; int sock = UDP_bind(myPort); //printf("my file is %s waiting on port %i\n", genome_file, myPort); myGenome.transcribeGene("//green_appearance", 1, portstr.str().c_str()); srandom(100); stringstream net_file; net_file<<genome_file<<"."<<myPort<<".net"; myNet.name = net_file.str(); myNet.saveToFile(net_file.str().c_str()); myGenome.transcribeGene("//add_eye", 2, genome_file, portstr.str().c_str()); myGenome.transcribeGene("//add_eye", 2, genome_file, portstr.str().c_str()); myGenome.transcribeGene("//add_auditory", 2, genome_file, portstr.str().c_str()); myGenome.transcribeGene("//add_reproduction", 2, genome_file, portstr.str().c_str()); myGenome.transcribeGene("//add_movement", 2, genome_file, portstr.str().c_str()); myGenome.transcribeGene("//add_turn", 2, genome_file, portstr.str().c_str()); myGenome.transcribeGene("//connect_subnets", 2, genome_file, portstr.str().c_str()); myNet.loadFromFile(net_file.str().c_str()); myNet.printStats(); //printf("body\n"); stringstream child_file; child_file<<genome_file<<n_children; //myGenome.transcribeGene("//asexual_reproduction", 4, portstr.str().c_str(), genome_file, child_file.str().c_str(), worldportstr.str().c_str()); int n=4; while(1) { try { int status; while (waitpid(-1, &status, WNOHANG)>0); int nMessages=0; do { nMessages = check_for_message(sock); } while (nMessages>0); myNet.addClick(); map<string,int>output_length; map<string,unsigned char*>output_data; myNet.getOutput(output_length, output_data); myGenome.transcribeGeneIfSubnetFires(output_length, output_data, "talk", 0.25, "//say", 1, portstr.str().c_str()) ; myGenome.transcribeGeneIfSubnetFires(output_length, output_data, "move", 0.2, "//move", 1, portstr.str().c_str()) ; myGenome.transcribeGeneIfSubnetFires(output_length, output_data, "turn", 0.1, "//turn", 1, portstr.str().c_str()) ; myGenome.transcribeGeneIfSubnetFires(output_length, output_data, "attack", 0.1, "//attack", 1, portstr.str().c_str()) ; myGenome.transcribeGeneIfSubnetFires(output_length, output_data, "eat", 0.2, "//eat", 1, portstr.str().c_str()) ; stringstream child_file; child_file<<genome_file<<n_children; myGenome.transcribeGeneIfSubnetFires(output_length, output_data, "reproduction", 0.33, "//asexual_reproduction", 4, portstr.str().c_str(), genome_file, child_file.str().c_str(), worldportstr.str().c_str()) ; usleep(1000); //sleep(2); } catch (...) { printf("organism %i error\n", myPort); } } close (sock); return 1; }