Example #1
0
/**	TELNETデーモン・タスク(ブロッキング、省コピーAPI)
 *	@param	exinf	タスク起動時パラメータ
 ****************************************************************************** */
void	TELNET_Task( VP_INT exinf )
{
static TELNET_PARA	mTelnetParaTbl[] =
	{
		{ FALSE, TELNET_DAEMON_REPID1, TELNET_DAEMON_CEPID1, TELNET_DEFAULT_TIMEOUT	},
		{ FALSE, TELNET_DAEMON_REPID2, TELNET_DAEMON_CEPID2, TELNET_DEFAULT_TIMEOUT	}
	};
TELNET_PARA	*para;
CONSOLE		cnsl;
ER			errcd = E_OK;
T_IPV4EP	dst;

	para = &mTelnetParaTbl[ (int)exinf ];
	CONSOLE_MakeConsole( &cnsl, (void*)para, TELNET_Read, TELNET_Write, NULL,
						(char*)mTelnetWork.WorkBuffer[ (int)exinf ], WORK_BUFFER_LEN );
	cnsl.EchoBack = FALSE;
	cnsl.Flash = (void*)TELNET_Flash;
	
	while(1)
	{
		/*----- 接続待ち -----------------------------------*/
		errcd = tcp_acp_cep( para->CepID, para->RepID, &dst, TMO_FEVR );	/* 接続待ち開始 */
		if( errcd != E_OK ) continue;

		/*----- 接続した -----------------------------------*/
//		CONSOLE_Flash( &cnsl );
		para->OpenFg = TRUE;
		Shell_Main( &cnsl );											 	/* Shell実行	*/

		/*----- 切断した -----------------------------------*/
		para->OpenFg = FALSE;
		errcd = tcp_sht_cep( para->CepID );									/* 通信端点切断 */
		errcd = tcp_cls_cep( para->CepID, TMO_FEVR );						/* 通信端点クローズ */
	}
}
Example #2
0
void
tcp_echo_srv_task(intptr_t exinf)
{
    ID		tskid;
    ER_UINT		rlen, slen;
    ER		error = E_OK;
    uint16_t	soff, count, total;

    get_tid(&tskid);
    syslog(LOG_NOTICE, "[TCP ECHO SRV:%d,%d] started.", tskid, (int_t)exinf);
    while (true) {
        if (tcp_acp_cep((int_t)exinf, TCP_ECHO_SRV_REPID, &dst, TMO_FEVR) != E_OK) {
            syslog(LOG_NOTICE, "[TCP ECHO SRV ACP] error: %s", itron_strerror(error));
            continue;
        }

        total = count = 0;
        syslog(LOG_NOTICE, "[TCP ECHO SRV ACP] connected from %s:%d",
               ip2str(NULL, &dst.ipaddr), dst.portno);
        while (true) {
            if ((rlen = tcp_rcv_dat((int_t)exinf, buffer, BUF_SIZE - 1, TMO_FEVR)) <= 0) {
                if (rlen != E_OK)
                    syslog(LOG_NOTICE, "[TCP ECHO SRV RCV] error: %s",
                           itron_strerror(rlen));
                break;
            }

            /*syslog(LOG_NOTICE, "[TCP ECHO SRV RCV] count: %4d, len: %4d, data %02x -> %02x",
                   ++ count, (uint16_t)rlen, *buffer, *(buffer + rlen - 1));*/
            count ++;
            total += (uint16_t)rlen;
            soff = 0;
            while (rlen > 0) {
                if ((slen = tcp_snd_dat((int_t)exinf, &buffer[soff], rlen, TMO_FEVR)) < 0) {
                    syslog(LOG_NOTICE, "[TCP ECHO SRV SND] error: %s",
                           itron_strerror(slen));
                    goto err_fin;
                }
                /*syslog(LOG_NOTICE, "[TCP ECHO SRV SND] len: %d", slen);*/
                rlen -=     slen;
                soff += (uint16_t)slen;
            }
        }
err_fin:

        if ((error = tcp_sht_cep((int_t)exinf)) != E_OK)
            syslog(LOG_NOTICE, "[TCP ECHO SRV SHT] error: %s", itron_strerror(error));

        if ((error = tcp_cls_cep((int_t)exinf, TMO_FEVR)) != E_OK)
            syslog(LOG_NOTICE, "[TCP ECHO SRV CLS] error: %s", itron_strerror(error));

        syslog(LOG_NOTICE, "[TCP ECHO SRV FIN] finished, total cnt: %d, len: %d", count, total);
    }
}
Example #3
0
BOOL cg_socket_accept(CgSocket *serverSock, CgSocket *clientSock)
{
	struct sockaddr_in sockaddr;
	socklen_t socklen;
	char localAddr[CG_NET_SOCKET_MAXHOST];
	char localPort[CG_NET_SOCKET_MAXSERV];
#if defined(BTRON) || (defined(TENGINE) && !defined(CG_TENGINE_NET_KASAGO))
	struct sockaddr_in sockaddr;
	W nLength = sizeof(struct sockaddr_in);
	cg_socket_setid(clientSock, so_accept(serverSock->id, (SOCKADDR *)&sockaddr, &nLength));
#elif defined(TENGINE) && defined(CG_TENGINE_NET_KASAGO)
	struct sockaddr_in sockaddr;
	int nLength = sizeof(struct sockaddr_in);
	cg_socket_setid(clientSock, ka_accept(serverSock->id, (struct sockaddr *)&sockaddr, &nLength));
#elif defined(ITRON)
	T_IPV4EP dstAddr;
	if (tcp_acp_cep(serverSock->id, serverSock->id, &dstAddr, TMO_FEVR) != E_OK)
		return FALSE;
	cg_socket_setid(clientSock, cg_socket_getid(serverSock));
#else
	struct sockaddr_storage sockClientAddr;
	socklen_t nLength = sizeof(sockClientAddr);
	cg_socket_setid(clientSock, accept(serverSock->id, (struct sockaddr *)&sockClientAddr, &nLength));
#endif

	cg_log_debug_l4("Entering...\n");

#ifdef SOCKET_DEBUG
cg_log_debug_s("clientSock->id = %d\n", clientSock->id);
#endif
	
#if defined (WIN32) && !defined(ITRON)
	if (clientSock->id == INVALID_SOCKET)
		return FALSE;
#else
	if (clientSock->id < 0)
		return FALSE;
#endif
	
	cg_socket_setaddress(clientSock, cg_socket_getaddress(serverSock));
	cg_socket_setport(clientSock, cg_socket_getport(serverSock));
	socklen = sizeof(struct sockaddr_in);
	
	if (getsockname(clientSock->id, (struct sockaddr *)&sockaddr, &socklen) == 0 &&
	    getnameinfo((struct sockaddr *)&sockaddr, socklen, localAddr, sizeof(localAddr), 
			localPort, sizeof(localPort), NI_NUMERICHOST | NI_NUMERICSERV) == 0) 
	{
		/* Set address for the sockaddr to real addr */
		cg_socket_setaddress(clientSock, localAddr);
	}
	
#ifdef SOCKET_DEBUG
cg_log_debug_s("clientSock->id = %s\n", cg_socket_getaddress(clientSock));
cg_log_debug_s("clientSock->id = %d\n", cg_socket_getport(clientSock));
#endif
	
	
	return TRUE;

	cg_log_debug_l4("Leaving...\n");
}
Example #4
0
void
tcp_telnet_srv_task(VP_INT exinf)
{
	UW	total;
	UH	rlen, slen, soff, count, sblen, rblen;
	ID	tskid;
	ER	error;
	UB	head, tail;
    T_IF_SOFTC  *ic;

	get_tid(&tskid);
	syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK):%d,%d] started.", tskid, (INT)exinf);

	while (TRUE) {
		if ((error = tcp_acp_cep((INT)exinf, TCP_TELNET_SRV_REPID, &dst, TMO_NBLK)) != E_WBLK) {
			syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) ACP] error: %s", itron_strerror(error));
			continue;
		}

		/* 相手から接続されるまで待つ。*/
		syscall(wai_sem(SEM_TCP_TELNET_SRV_NBLK_READY));

		if (nblk_error == E_OK) {
			syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) ACP] connected from %s:%d",
			                   ip2str(NULL, &dst.ipaddr), dst.portno);
		}
		else {
			syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) ACP] error: %s", itron_strerror(nblk_error));
			continue;
		}
		connect = TRUE;

		count = total = 0;
		while (TRUE) {
			if ((error = tcp_rcv_dat((INT)exinf, buffer, BUF_SIZE - 1, TMO_NBLK)) != E_WBLK) {
				syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) RCV] error: %s",
				                   itron_strerror(error));
				break;
			}

			/* 受信完了まで待つ。*/
			syscall(wai_sem(SEM_TCP_TELNET_SRV_NRCV_READY));

			if (nblk_rlen < 0) {
				syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) RCV] error: %s",
				                   itron_strerror(nblk_rlen));
				break;
			}
			else if (nblk_rlen == 0)
				break;

			rlen   = (UH)nblk_rlen;
			total += (UW)nblk_rlen;
			head = *buffer;
			tail = *(buffer + rlen - 1);
			count ++;
			/*syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) RCV] count: %4d, len: %4d, data %02x -> %02x",
			                   ++ count, rlen, head, tail);*/
			soff = 0;
			while (rlen > 0) {
				sblen, telnet_copy(buffer + soff, buffer + soff, rlen, &rblen);
				if ((error = tcp_snd_dat((INT)exinf, &buffer[soff], sblen, TMO_NBLK)) != E_WBLK) {
					syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) SND] error: %s",
					                   itron_strerror(error));
					goto err_fin;
				}

				/* 送信完了まで待つ。*/
				syscall(wai_sem(SEM_TCP_TELNET_SRV_NSND_READY));

				if (nblk_slen < 0) {
					syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) SND] error: %s",
					                   itron_strerror(nblk_slen));
					goto err_fin;
				}
				else
					/*syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) SND] len: %4d", nblk_slen)*/;

				slen = (UH)nblk_slen;
				rlen -= rblen;
				soff += slen;
			}
		}
	err_fin:

		if ((error = tcp_sht_cep((INT)exinf)) != E_OK)
			syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) SHT] error: %s", itron_strerror(error));

		if ((error = tcp_cls_cep((INT)exinf, TMO_NBLK)) != E_WBLK)
			syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) CLS] error: %s", itron_strerror(error));
		connect = FALSE;

		/* 開放が完了するまで待つ。*/
		syscall(wai_sem(SEM_TCP_TELNET_SRV_NBLK_READY));

		syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) FIN] finished, total cnt: %d, len: %d", count, total);
	}
}
Example #5
0
void
tcp_telnet_srv_task(VP_INT exinf)
{
	UW	total;
	UH	rblen, sblen, rlen, slen, soff, count;
	UB	*rbuf, *sbuf, head, tail;
	ID	tskid;
	ER	error = E_OK;
    T_IF_SOFTC  *ic;

	get_tid(&tskid);
	syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK):%d,%d] (copy save API) started.", tskid, (INT)exinf);

	while (TRUE) {
		if ((error = tcp_acp_cep((INT)exinf, TCP_TELNET_SRV_REPID, &dst, TMO_NBLK)) != E_WBLK) {
			syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) ACP] error: %s", itron_strerror(error));
			continue;
			}

		/* 相手から接続されるまで待つ。*/
		syscall(wai_sem(SEM_TCP_TELNET_SRV_NBLK_READY));

		if (nblk_error == E_OK)
			syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) ACP] connected from %s:%d", ip2str(NULL, &dst.ipaddr), dst.portno);
		else {
			syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) ACP] error: %s", itron_strerror(nblk_error));
			continue;
		}
		connect = TRUE;

		total = rlen = count = 0;
		while (TRUE) {
			if ((error = tcp_rcv_buf((INT)exinf, (VP *)&rbuf, TMO_NBLK)) != E_WBLK) {
				syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) RCV] error: %s", itron_strerror(error));
				break;
			}

			/* 受信するまで待つ。*/
			syscall(wai_sem(SEM_TCP_TELNET_SRV_NRCV_READY));

			if (nblk_rlen < 0) {		/* エラー */
				syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) RCV] error: %s", itron_strerror(nblk_rlen));
				break;
			}
			else if (nblk_rlen == 0)	/* 受信終了 */
				break;

			rblen = (UH)nblk_rlen;

			/* バッファの残りにより、受信長を調整する。*/
			if (rblen > BUF_SIZE - rlen)
				rblen = BUF_SIZE - rlen;
			total += rblen;
			rlen   = rblen;

			head = *rbuf;
			tail = *(rbuf + rblen - 1);
			count ++;
			/*syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) RCV] "
			                   "count: %4d, len: %4d, data %02x -> %02x",
			                   ++ count, rblen, head, tail);*/
			memcpy(buffer, rbuf, rblen);

			if ((error = tcp_rel_buf((INT)exinf, rlen)) < 0) {
				syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) REL] error: %s",
				                   itron_strerror(error));
				break;
			}

			soff = 0;
			while (rlen > 0) {

				if ((error = tcp_get_buf((INT)exinf, (VP *)&sbuf, TMO_NBLK)) != E_WBLK) {
					syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) GET] error: %s",
					                   itron_strerror(error));
					goto err_fin;
				}

				/* 送信バッファの獲得が完了するまで待つ。*/
				syscall(wai_sem(SEM_TCP_TELNET_SRV_NSND_READY));

				if (nblk_slen < 0) {
					syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) GET] error: %s",
					                   itron_strerror(nblk_slen));
					goto err_fin;
				}
				else
					/*syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) GET] len: %d", nblk_slen)*/;

				sblen = (UH)nblk_slen;
				slen = sblen < rlen ? sblen : rlen;
#if 0	/* ROI DEBUG */
				memcpy(sbuf, buffer + soff, slen);
#else	/* ROI DEBUG */
				slen = telnet_copy(sbuf, buffer + soff, slen, &rblen);
#endif	/* ROI DEBUG */

				if ((error = tcp_snd_buf((INT)exinf, slen)) != E_OK) {
					syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) SND] error: %s",
					                   itron_strerror(error));
					goto err_fin;
				}
				/*syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) SND] len: %d", slen);*/

#if 0	/* ROI DEBUG */
				rlen -= slen;
#else	/* ROI DEBUG */
				rlen -= rblen;
#endif	/* ROI DEBUG */
				soff += slen;
			}
		}
	err_fin:

		if ((error = tcp_sht_cep((INT)exinf)) != E_OK)
			syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) SHT] error: %s", itron_strerror(error));

		if ((error = tcp_cls_cep((INT)exinf, TMO_NBLK)) != E_WBLK)
			syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) CLS] error: %s", itron_strerror(error));
		connect = FALSE;

		/* 開放が完了するまで待つ。*/
		syscall(wai_sem(SEM_TCP_TELNET_SRV_NBLK_READY));

		syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) FIN] finished, total count: %d, len: %d", count, total);
	}
}
Example #6
0
void
tcp_echo_srv_task(intptr_t exinf)
{
    ID		tskid;
    ER_UINT		rblen, sblen;
    ER		error = E_OK;
    uint32_t	total;
    uint16_t	rlen, slen, soff, count;
    char		*rbuf, *sbuf, head, tail;

    get_tid(&tskid);
    syslog(LOG_NOTICE, "[TCP ECHO SRV:%d,%d] (copy save API) started.", tskid, (int_t)exinf);
    while (true) {
        if (tcp_acp_cep((int_t)exinf, TCP_ECHO_SRV_REPID, &dst, TMO_FEVR) != E_OK) {
            syslog(LOG_NOTICE, "[TCP ECHO SRV ACP] error: %s", itron_strerror(error));
            continue;
        }

        total = count = 0;
        syslog(LOG_NOTICE, "[TCP ECHO SRV ACP] connected from %s:%d", ip2str(NULL, &dst.ipaddr), dst.portno);
        while (true) {
            if ((rblen = tcp_rcv_buf((int_t)exinf, (void **)&rbuf, TMO_FEVR)) <= 0) {
                if (rblen != E_OK)
                    syslog(LOG_NOTICE, "[TCP ECHO SRV RCV] error: %s", itron_strerror(rblen));
                break;
            }

            rlen   = (uint16_t)rblen;
            total += (uint32_t)rblen;
            head = *rbuf;
            tail = *(rbuf + rlen - 1);
            count ++;
            /*syslog(LOG_NOTICE, "[TCP ECHO SRV RCV] count: %4d, len: %4d, data %02x -> %02x",
                   ++ count, rlen, head, tail);*/

            soff = 0;
            while (rlen > 0) {

                if ((sblen = tcp_get_buf((int_t)exinf, (void **)&sbuf, TMO_FEVR)) < 0) {
                    syslog(LOG_NOTICE, "[TCP ECHO SRV GET] error: %s",
                           itron_strerror(sblen));
                    goto err_fin;
                }
                /*syslog(LOG_NOTICE, "[TCP ECHO SRV GET] len: %d", sblen);*/

                slen = rlen < (uint16_t)sblen ? rlen : (uint16_t)sblen;
                memcpy(sbuf, rbuf + soff, slen);
                if ((error = tcp_snd_buf((int_t)exinf, slen)) != E_OK) {
                    syslog(LOG_NOTICE, "[TCP ECHO SRV SND] error: %s",
                           itron_strerror(error));
                    goto err_fin;
                }
                /*syslog(LOG_NOTICE, "[TCP ECHO SRV SND] len: %d", slen);*/

                rlen -= slen;
                soff += slen;
            }

            if ((error = tcp_rel_buf((int_t)exinf, rblen)) < 0) {
                syslog(LOG_NOTICE, "[TCP ECHO SRV REL] error: %s", itron_strerror(error));
                break;
            }
        }
err_fin:

        if ((error = tcp_sht_cep((int_t)exinf)) != E_OK)
            syslog(LOG_NOTICE, "[TCP ECHO SRV SHT] error: %s", itron_strerror(error));

        if ((error = tcp_cls_cep((int_t)exinf, TMO_FEVR)) != E_OK)
            syslog(LOG_NOTICE, "[TCP ECHO SRV CLS] error: %s", itron_strerror(error));

        syslog(LOG_NOTICE, "[TCP ECHO SRV FIN] finished, total cnt: %d, len: %d", count, total);
    }
}
Example #7
0
void
tcp_echo_srv_task(intptr_t exinf)
{
    ID		tskid;
    ER		error;
    uint32_t	total;
    uint16_t	rlen, slen, soff, count;
    char		head, tail;

    get_tid(&tskid);
    syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK):%d,%d] started.", tskid, (int_t)exinf);
    while (true) {
        if ((error = tcp_acp_cep((int_t)exinf, TCP_ECHO_SRV_REPID, &dst, TMO_NBLK)) != E_WBLK) {
            syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] error: %s", itron_strerror(error));
            continue;
        }

        /* 相手から接続されるまで待つ。*/
        syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));

        if (nblk_error == E_OK) {
            syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] connected from %s:%d",
                   ip2str(NULL, &dst.ipaddr), dst.portno);
        }
        else {
            syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] error: %s", itron_strerror(nblk_error));
            continue;
        }

        count = total = 0;
        while (true) {
            if ((error = tcp_rcv_dat((int_t)exinf, buffer, BUF_SIZE - 1, TMO_NBLK)) != E_WBLK) {
                syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) RCV] error: %s",
                       itron_strerror(error));
                break;
            }

            /* 受信完了まで待つ。*/
            syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));

            if (nblk_rlen < 0) {
                syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) RCV] error: %s",
                       itron_strerror(nblk_rlen));
                break;
            }
            else if (nblk_rlen == 0)
                break;

            rlen   = (uint16_t)nblk_rlen;
            total += (uint32_t)nblk_rlen;
            head = *buffer;
            tail = *(buffer + rlen - 1);
            count ++;
            /*syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) RCV] count: %4d, len: %4d, data %02x -> %02x",
                               ++ count, rlen, head, tail);*/
            soff = 0;
            while (rlen > 0) {
                if ((error = tcp_snd_dat((int_t)exinf, &buffer[soff], rlen, TMO_NBLK)) != E_WBLK) {
                    syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] error: %s",
                           itron_strerror(error));
                    goto err_fin;
                }

                /* 送信完了まで待つ。*/
                syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));

                if (nblk_slen < 0) {
                    syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] error: %s",
                           itron_strerror(nblk_slen));
                    goto err_fin;
                }
                else
                    /*syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] len: %4d", nblk_slen)*/;

                slen = (uint16_t)nblk_slen;
                rlen -= slen;
                soff += slen;
            }
        }
err_fin:

        if ((error = tcp_sht_cep((int_t)exinf)) != E_OK)
            syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SHT] error: %s", itron_strerror(error));

        if ((error = tcp_cls_cep((int_t)exinf, TMO_NBLK)) != E_WBLK)
            syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) CLS] error: %s", itron_strerror(error));

        /* 開放が完了するまで待つ。*/
        syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));

        syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) FIN] finished, total cnt: %d, len: %d", count, total);
    }
}
Example #8
0
void
tcp_echo_srv_task(intptr_t exinf)
{
    ID		tskid;
    ER		error = E_OK;
    uint32_t	total;
    uint16_t	rblen, sblen, rlen, slen, soff, count;
    char		*rbuf, *sbuf, head, tail;

    get_tid(&tskid);
    syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK):%d,%d] (copy save API) started.", tskid, (int_t)exinf);
    while (true) {
        if ((error = tcp_acp_cep((int_t)exinf, TCP_ECHO_SRV_REPID, &dst, TMO_NBLK)) != E_WBLK) {
            syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] error: %s", itron_strerror(error));
            continue;
        }

        /* 相手から接続されるまで待つ。*/
        syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));

        if (nblk_error == E_OK)
            syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] connected from %s:%d", ip2str(NULL, &dst.ipaddr), dst.portno);
        else {
            syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] error: %s", itron_strerror(nblk_error));
            continue;
        }

        total = rlen = count = 0;
        while (true) {
            if ((error = tcp_rcv_buf((int_t)exinf, (void **)&rbuf, TMO_NBLK)) != E_WBLK) {
                syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) RCV] error: %s", itron_strerror(error));
                break;
            }

            /* 受信するまで待つ。*/
            syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));

            if (nblk_rlen < 0) {		/* エラー */
                syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) RCV] error: %s", itron_strerror(nblk_rlen));
                break;
            }
            else if (nblk_rlen == 0)	/* 受信終了 */
                break;

            rblen = (uint16_t)nblk_rlen;

            /* バッファの残りにより、受信長を調整する。*/
            if (rblen > BUF_SIZE - rlen)
                rblen = BUF_SIZE - rlen;
            total += rblen;
            rlen   = rblen;

            head = *rbuf;
            tail = *(rbuf + rblen - 1);
            count ++;
            /*syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) RCV] "
                               "count: %4d, len: %4d, data %02x -> %02x",
                               ++ count, rblen, head, tail);*/
            memcpy(buffer, rbuf, rblen);

            if ((error = tcp_rel_buf((int_t)exinf, rlen)) < 0) {
                syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) REL] error: %s",
                       itron_strerror(error));
                break;
            }

            soff = 0;
            while (rlen > 0) {

                if ((error = tcp_get_buf((int_t)exinf, (void **)&sbuf, TMO_NBLK)) != E_WBLK) {
                    syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) GET] error: %s",
                           itron_strerror(error));
                    goto err_fin;
                }

                /* 送信バッファの獲得が完了するまで待つ。*/
                syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));

                if (nblk_slen < 0) {
                    syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) GET] error: %s",
                           itron_strerror(nblk_slen));
                    goto err_fin;
                }
                else
                    /*syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) GET] len: %d", nblk_slen)*/;

                sblen = (uint16_t)nblk_slen;
                slen = sblen < rlen ? sblen : rlen;
                memcpy(sbuf, buffer + soff, slen);

                if ((error = tcp_snd_buf((int_t)exinf, slen)) != E_OK) {
                    syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] error: %s",
                           itron_strerror(error));
                    goto err_fin;
                }
                /*syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] len: %d", slen);*/

                rlen -= slen;
                soff += slen;
            }
        }
err_fin:

        if ((error = tcp_sht_cep((int_t)exinf)) != E_OK)
            syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SHT] error: %s", itron_strerror(error));

        if ((error = tcp_cls_cep((int_t)exinf, TMO_NBLK)) != E_WBLK)
            syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) CLS] error: %s", itron_strerror(error));

        /* 開放が完了するまで待つ。*/
        syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));

        syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) FIN] finished, total count: %d, len: %d", count, total);
    }
}