int server(int protocol_type) { server_done = false; server_event_num = 0; num_msg_recd = 0; char address[256]; snprintf(address, 256, "%s://*:%d", protocol_type == msg_udp ? "udp" : "tcp", protocol_type == msg_udp ? udp_port : tcp_port); server_ctx.address = strdup(address); server_ctx.num_tries = 0; msg_listen(address, server_update); int timeout_in_ms = 10; // Sleep for 1ms to give the client time to send all the messages. usleep(1000); while (!server_done) msg_runloop(timeout_in_ms); test_that(num_msg_recd == 3); free(server_ctx.address); // Sleep for 1ms as the client expects to finish before the server. // (Early server termination could be an error, so we check for it.) usleep(1000); return test_success; }
void hmsg_monitor(void) { int i, maxi, listenfd, clifd, nread; char buf[MAXLINE]; uid_t uid; struct pollfd *pollfd; if ((pollfd = malloc(open_max() * sizeof(struct pollfd))) == NULL) dlog(L_ERR, "malloc error"); /* obtain fd to listen for client requests on */ if ((listenfd = msg_listen(MSG_PATH)) < 0) dlog(L_ERR, "msg_listen error"); client_add(listenfd, 0); /* we use [0] for listenfd */ pollfd[0].fd = listenfd; pollfd[0].events = POLLIN; maxi = 0; for ( ; ; ) { if (poll(pollfd, maxi + 1, -1) < 0) dlog(L_ERR, "poll error"); if (pollfd[0].revents & POLLIN) { /* accept new client request */ if ((clifd = serv_accept(listenfd, &uid)) < 0) dlog(L_ERR, "serv_accept error: %d", clifd); i = client_add(clifd, uid); pollfd[i].fd = clifd; pollfd[i].events = POLLIN; if (i > maxi) maxi = i; dlog(L_INFO, "new connection: uid %d, fd %d\n", uid, clifd); } for (i = 1; i <= maxi; i++) { if ((clifd = client[i].fd) < 0) continue; if (pollfd[i].revents & POLLHUP) { goto hungup; } else if (pollfd[i].revents & POLLIN) { /* read argument buffer from client */ if ((nread = read(clifd, buf, MAXLINE)) < 0) { dlog(L_ERR, "read error on fd %d\n", clifd); } else if (nread == 0) { hungup: dlog(L_INFO, "closed: uid %d, fd %d\n", client[i].uid, clifd); client_del(clifd); /* client has closed conn */ pollfd[i].fd = -1; close(clifd); } else { /* process client's request */ msg_parse_arg(buf, nread, clifd, client[i].uid); } } } } }
void server_update(msg_Conn *conn, msg_Event event, msg_Data data) { // We expect to hear events in this order. int expected_events[] = { msg_listening, msg_connection_ready, msg_message, msg_message, msg_message, msg_connection_closed}; test_printf("Server: Received event %s\n", event_names[event]); if (event == msg_error) { char *err_str = msg_as_str(data); test_printf("Server: Error: %s\n", err_str); if (strcmp(err_str, "bind: Address already in use") == 0) { if (server_ctx.num_tries < max_tries) { test_printf("Will wait briefly and try again at address %s.\n", server_ctx.address); sleep(5); server_ctx.num_tries++; msg_listen(server_ctx.address, server_update); return; // Don't count this as a server event. } else { test_printf("Server: max_tries reached; giving up listening (at %s).\n", server_ctx.address); } } } test_that(server_event_num < array_size(expected_events)); test_that(event == expected_events[server_event_num]); if (event == msg_message) { char *str = msg_as_str(data); test_str_eq(str, "why hello"); server_done = true; num_msg_recd++; } server_event_num++; }
//################## MAIN ################################### int main(void){ unsigned char prv; idata IData; boolian IPacketMode=0; odata OData; boolian OPacketMode=0; sint8 debug_cnt=0; //初期化 initialize(); //メッセージ登録 msg_regist('m',motor_setup_listen,motor_listen,motor_setup_talk,motor_talk); msg_regist('j',sprite_setup_listen,sprite_listen,sprite_setup_talk,sprite_talk); msg_regist('b',battery_setup_listen,battery_listen,battery_setup_talk,battery_talk); msg_regist('g',gps_setup_listen,gps_listen,gps_setup_talk,gps_talk); msg_regist('C',co2_setup_listen,co2_listen,co2_setup_talk,co2_talk); // msg_regist('S',h2s_message); msg_regist('t',thermo_setup_listen,thermo_listen,thermo_setup_talk,thermo_talk); // msg_regist('T',infrared_setup_listen,infrared_listen,infrared_setup_talk,infrared_talk); msg_regist('h',0,0,0,0); msg_regist('c',compass_setup_listen,compass_listen,compass_setup_talk,compass_talk); msg_regist('a',axel_setup_listen,axel_listen,axel_setup_talk,axel_talk); msg_regist('G',gyro_setup_listen,gyro_listen,gyro_setup_talk,gyro_talk); msg_regist('!',debug_setup_listen,debug_listen,debug_setup_talk,debug_talk); /* HMR_PIN_RedLED_set(0); HMR_PIN_YellowLED_set(0); delay_ms(500); HMR_PIN_RedLED_set(1); HMR_PIN_YellowLED_set(1); delay_ms(500); HMR_PIN_RedLED_set(0); HMR_PIN_YellowLED_set(0); delay_ms(500); HMR_PIN_RedLED_set(1); HMR_PIN_YellowLED_set(1); delay_ms(500); HMR_PIN_RedLED_set(0); HMR_PIN_YellowLED_set(0); HMR_PIN_RedLED_set(1); */ HMR_PIN_DebugLED_set(0); HMR_PIN_Debug2LED_set(0); while(1){ delay_ms(5); //Watch Dog Timer リセット restart_wdt(); //受信可能なデータが無ければ再び待つ if(!com_in_empty()){ //@@@@@@ Begin Critical@@@@@@ prv = hmr_lock_interrupt(); com_in_move_pop(&IData); hmr_release_interrupt(prv); //@@@@@@ End Critical@@@@@@ if(idata_is_construct(&IData)){ //PacketModeに入っていないとき if(!IPacketMode){ //Packetをここで開く IPacketMode=hmLib_true; msg_setup_listen(); } //Packet終了IDだった場合 if(IData.ID==HMR_COM_PACTRMNID){ //Packetがここで終了 IPacketMode=hmLib_false; prv = hmr_lock_interrupt(); idata_destruct(&IData); hmr_release_interrupt(prv); }else{ //メッセージ処理 prv = hmr_lock_interrupt(); msg_listen(&IData); hmr_release_interrupt(prv); } } } delay_ms(5); //送信待ちのPacketがなく、comの送信バッファがいっぱいでもないとき if(!com_isWaitSendPacket() && !com_out_full()){ //PacketModeに入っていないとき if(!OPacketMode){ //Packetをここで開く OPacketMode=hmLib_true; msg_setup_talk(); } //送信用データを準備する odata_format(&OData); //送信データの取得に失敗した場合 prv = hmr_lock_interrupt(); if(msg_talk(&OData)){ //内部で作成されていれば破棄 if(odata_is_construct(&OData))odata_destruct(&OData); //Packetをここで閉じる OPacketMode=hmLib_false; OData.ID=HMR_COM_PACTRMNID; } hmr_release_interrupt(prv); //送信データを登録する //@@@@@@ Begin Critical@@@@@@ prv = hmr_lock_interrupt(); com_out_move_push(&OData); hmr_release_interrupt(prv); //@@@@@@ End Critical@@@@@@ } //送信割り込みが切られていて、かつ送信可能状態のときには、送信割り込みをオンにする if(!uart1_is_enable_fput_interrupt()){ if(vmc1_can_send(pVMC))uart1_enable_fput_interrupt(); } if(debug_cnt<0){ HMR_PIN_DebugLED_set(1); }else{ HMR_PIN_DebugLED_set(0); } ++debug_cnt; } finalize(); return 0; }