void *print_thread(void *connfd) { char buff[500]; while(1) { if(kbhit()) { pthread_mutex_lock(&gl_mutex); memset(&(buff),0,sizeof(buff)); scanf("%s",buff); switch(buff[0]) { case '0':set_server_data(SREFUSE,*(int *)connfd);break; case '1':set_server_data(SRLINK,*(int *)connfd);break; case '2':set_server_data(SGIVE_TABLE,*(int *)connfd);break; case '3':set_server_data(SCREAT_GAME,*(int *)connfd);break; case '4':set_server_data(SASK_PLAYER,*(int *)connfd);break; case '5':set_server_data(SRETURN_BATTLE,*(int *)connfd);break; case '6':set_server_data(SRETURN_WINNER,*(int *)connfd);break; case '7':set_server_data(SCHAT,*(int *)connfd);break; default:printf("error input:%s\n",buff); } printf("%s\n",buff); setbuf(stdin, NULL); //clear stdin pthread_mutex_unlock(&gl_mutex); } usleep(100); } return NULL; }
/** * サーバプロセス * * @param[in] arg ソケットディスクリプタ * @return 常にNULL */ static void * server_proc(void *arg) { thread_data dt; /* スレッドデータ構造体 */ int retval = 0; /* 戻り値 */ size_t length = 0; /* 長さ */ ssize_t slen = 0; /* 送信するバイト数 */ struct header hd; /* ヘッダ構造体 */ unsigned char *expr = NULL; /* 受信データ */ calcinfo calc; /* calc情報構造体 */ struct server_data *sdata = NULL; /* 送信データ構造体 */ (void)memcpy(&dt, arg, sizeof(thread_data)); dbglog("start: accept=%d sin_addr=%s sin_port=%d, len=%d", dt.sock, inet_ntoa(dt.addr.sin_addr), ntohs(dt.addr.sin_port), dt.len); /* シグナルマスクを設定 */ set_thread_sigmask(dt.sigmask); pthread_cleanup_push(thread_cleanup, &dt); do { /* ヘッダ受信 */ length = sizeof(struct header); (void)memset(&hd, 0, length); retval = recv_data(dt.sock, &hd, &length); if (retval < 0) /* エラーまたは接続先がシャットダウンされた */ pthread_exit((void *)EXIT_FAILURE); dbglog("recv_data: hd=%p, length=%zu, hd.length=%zu", &hd, length, hd.length); if (g_gflag) outdump(&hd, length, "recv: hd=%p, length=%zu", &hd, length); stddump(&hd, length, "recv: hd=%p, length=%zu", &hd, length); /* データ受信 */ length = (size_t)ntohl((uint32_t)hd.length); /* データ長を保持 */ expr = (unsigned char *)recv_data_new(dt.sock, &length); if (!expr) /* メモリ不足 */ pthread_exit((void *)EXIT_FAILURE); pthread_cleanup_push(thread_memfree, &expr); if (!length) /* 受信エラー */ pthread_exit((void *)EXIT_FAILURE); dbglog("expr=%p, length=%zu", expr, length); if (g_gflag) outdump(expr, length, "recv: expr=%p, length=%zu", expr, length); stddump(expr, length, "recv: expr=%p, length=%zu", expr, length); /* サーバ処理 */ (void)memset(&calc, 0, sizeof(calcinfo)); if (!create_answer(&calc, expr)) pthread_exit((void *)EXIT_FAILURE); pthread_cleanup_push(destroy_answer, &calc); length = strlen((char *)calc.answer) + 1; /* 文字列長保持 */ dbgdump(calc.answer, length, "answer=%p, length=%zu", calc.answer, length); /* データ送信 */ slen = set_server_data(&sdata, calc.answer, length); if (slen < 0) /* メモリ確保できない */ pthread_exit((void *)EXIT_FAILURE); pthread_cleanup_push(thread_memfree, &sdata); dbglog("slen=%zd", slen); if (g_gflag) outdump(sdata, slen, "send: sdata=%p, slen=%zd", sdata, slen); stddump(sdata, slen, "send: sdata=%p, slen=%zd", sdata, slen); retval = send_data(dt.sock, sdata, (size_t *)&slen); if (retval < 0) /* エラー */ pthread_exit((void *)EXIT_FAILURE); dbglog("send_data: sdata=%p, slen=%zu", sdata, slen); pthread_cleanup_pop(1); pthread_cleanup_pop(1); pthread_cleanup_pop(1); } while (!g_sig_handled); pthread_cleanup_pop(1); pthread_exit((void *)EXIT_SUCCESS); return (void *)EXIT_SUCCESS; }