Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
/**
 * サーバプロセス
 *
 * @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;
}