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;
}
Esempio n. 2
0
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;
}