/** 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 ); /* 通信端点クローズ */ } }
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); } }
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"); }
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); } }
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); } }
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); } }
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); } }
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); } }