Ignore:
Timestamp:
Aug 23, 2017, 9:27:43 AM (7 years ago)
Author:
coas-nagasima
Message:

文字コードを設定

File:
1 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/tinet/netapp/tcp_echo_srv2.c

    • Property svn:keywords deleted
    • Property svn:mime-type changed from text/x-csrc to text/x-csrc;charset=UTF-8
    r270 r321  
    55 *                   Tomakomai National College of Technology, JAPAN
    66 *
    7  *  上記著作権è€
    8 ã¯ï¼Œä»¥ä¸‹ã® (1)~(4) の条件か,Free Software Foundation
    9  *  によってå
    10 ¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
    11  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
    12  *  を改変したものを含む.以下同じ)を使用・複製・改変・再é
    13 å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
    14  *  利用と呼ぶ)することを無償で許諾する.
    15  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    16  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
    17  *      スコード中に含まれていること.
    18  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    19  *      用できる形で再é
    20 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    21 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    22  *      è€
    23 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    24  *      の無保証規定を掲載すること.
    25  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    26  *      用できない形で再é
    27 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®æ¡ä»¶ã‚’満たすこと.
    28  *    (a) 再é
    29 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    30 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    31  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
    32  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    33  *      害からも,上記著作権è€
    34 ãŠã‚ˆã³TOPPERSプロジェクトをå
    35 è²¬ã™ã‚‹ã“と.
     7 *  上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation
     8 *  によって公表されている GNU General Public License の Version 2 に記
     9 *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
     10 *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
     11 *  利用と呼ぶ)することを無償で許諾する.
     12 *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     13 *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     14 *      スコード中に含まれていること.
     15 *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     16 *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     17 *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     18 *      の無保証規定を掲載すること.
     19 *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     20 *      用できない形で再配布する場合には,次の条件を満たすこと.
     21 *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     22 *        作権表示,この利用条件および下記の無保証規定を掲載すること.
     23 *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     24 *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
    3625 *
    37  *  本ソフトウェアは,無保証で提供されているものである.上記著作権è€
    38 ãŠ
    39  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
    40  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
    41  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
     26 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     27 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
     28 *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
     29 *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
    4230 *
    4331 *  @(#) $Id$
     
    4533
    4634/*
    47  *  TCP ECHO サーバ #2
     35 *  TCP ECHO サーバ #2
    4836 *
    49  *    ・送受信タスク分離型
    50  *    ・ノンブロッキングコール
    51  *    ・IPv4/IPv6
     37 *    ・送受信タスク分離型
     38 *    ・ノンブロッキングコール
     39 *    IPv4/IPv6
    5240 */
    5341
     
    9280
    9381/*
    94  *  表示
     82 *  表示
    9583 */
    9684
     
    9886
    9987/*
    100  *  コネクション切断方法の指定
     88 *  コネクション切断方法の指定
    10189 */
    10290
     
    10492
    10593/*
    106  *  å
    107 ¨åŸŸå¤‰æ•°
    108  */
    109 
    110 /* TCP 送受信ウィンドバッファ */
     94 *  全域変数
     95 */
     96
     97/* TCP 送受信ウィンドバッファ */
    11198
    11299#ifndef TCP_CFG_SWBUF_CSAVE
     
    119106
    120107/*
    121  *  変数
    122  */
    123 
    124 /*
    125  *  注意:
     108 *  変数
     109 */
     110
     111/*
     112 *  注意:
    126113 *
    127  *    BUF_SIZE は TCP の
    128  *    送信ウインドウバッファサイズ + 受信ウインドウバッファサイズの
    129  *    3/2 倍以上の大きさがなければ、デッドロックする可能性がある。
     114 *    BUF_SIZE は TCP の
     115 *    送信ウインドウバッファサイズ + 受信ウインドウバッファサイズの
     116 *    3/2 倍以上の大きさがなければ、デッドロックする可能性がある。
    130117 */
    131118
     
    133120                          TCP_ECHO_SRV_RWBUF_SIZE) * 3 / 2)
    134121
    135 static char     buffer[BUF_SIZE];       /* バッファ         */
    136 
    137 static T_IPEP   dst;                    /* 接続相手         */
    138 static bool_t   ena_rcv;                /* 受信可能フラグ        */
    139 static char     *rptr = buffer;         /* 受信ポインタ           */
    140 static char     *sptr = buffer;         /* 送信ポインタ           */
    141 static uint32_t rcv_total;              /* 受信文字数              */
    142 static uint32_t snd_total;              /* 送信文字数              */
    143 static uint16_t chars;                  /* バッファå†
    144 ã®æ–‡å­—æ•°    */
    145 static uint16_t rcv_count;              /* 受信回数         */
    146 static uint16_t snd_count;              /* 送信回数         */
     122static char     buffer[BUF_SIZE];       /* バッファ         */
     123
     124static T_IPEP   dst;                    /* 接続相手         */
     125static bool_t   ena_rcv;                /* 受信可能フラグ      */
     126static char     *rptr = buffer;         /* 受信ポインタ               */
     127static char     *sptr = buffer;         /* 送信ポインタ               */
     128static uint32_t rcv_total;              /* 受信文字数                */
     129static uint32_t snd_total;              /* 送信文字数                */
     130static uint16_t chars;                  /* バッファ内の文字数    */
     131static uint16_t rcv_count;              /* 受信回数         */
     132static uint16_t snd_count;              /* 送信回数         */
    147133
    148134#ifdef USE_TCP_NON_BLOCKING
    149135
    150 static ER       rcv_error = E_OK;       /* 受信、ノンブロッキングコールエラー */
    151 static ER       snd_error = 1;          /* 送信、ノンブロッキングコールエラー */
    152 
    153 /*
    154  *  ノンブロッキングコールのコールバック関数
     136static ER       rcv_error = E_OK;       /* 受信、ノンブロッキングコールエラー */
     137static ER       snd_error = 1;          /* 送信、ノンブロッキングコールエラー */
     138
     139/*
     140 *  ノンブロッキングコールのコールバック関数
    155141 */
    156142
     
    198184                        syscall(wai_sem(SEM_TCP_ECHO_SRV_LOCK));
    199185
    200                         /* 送信ポインタを進める。*/
     186                        /* 送信ポインタを進める。*/
    201187                        if (sptr - buffer + slen >= sizeof(buffer))
    202188                                sptr -= sizeof(buffer) - slen;
     
    204190                                sptr += slen;
    205191
    206                         /* バッファå†
    207 ã®æ–‡å­—数を減らす。*/
     192                        /* バッファ内の文字数を減らす。*/
    208193                        last   = chars;
    209194                        chars -= slen;
    210195
    211                         /* バッファå†
    212 ã«æ–‡å­—があれば、送信タスクを起床する。*/
     196                        /* バッファ内に文字があれば、送信タスクを起床する。*/
    213197                        if (chars > 0 || (!ena_rcv && chars == 0))
    214198                                sig_sem(SEM_TCP_ECHO_SRV_SND_READY);
    215199
    216                         /* 受信可能で、バッファå†
    217 ã«ç©ºããŒã§ãã‚Œã°ã€å—信タスクを起床する。*/
     200                        /* 受信可能で、バッファ内に空きができれば、受信タスクを起床する。*/
    218201                        if (ena_rcv && last == sizeof(buffer) && sizeof(buffer) - chars > 0)
    219202                                syscall(sig_sem(SEM_TCP_ECHO_SRV_RCV_READY));
     
    241224                        syscall(wai_sem(SEM_TCP_ECHO_SRV_LOCK));
    242225
    243                         /* 受信ポインタを進める。*/
     226                        /* 受信ポインタを進める。*/
    244227                        if (rptr - buffer + rlen >= sizeof(buffer))
    245228                                rptr -= sizeof(buffer) - rlen;
     
    247230                                rptr += rlen;
    248231
    249                         /* バッファå†
    250 ã®æ–‡å­—数を増やす。*/
     232                        /* バッファ内の文字数を増やす。*/
    251233                        last   = chars;
    252234                        chars += rlen;
    253235
    254                         /* バッファå†
    255 ã«æ–‡å­—がå
    256 ¥ã‚Œã°ã€é€ä¿¡ã‚¿ã‚¹ã‚¯ã‚’起床する。*/
     236                        /* バッファ内に文字が入れば、送信タスクを起床する。*/
    257237                        if (last == 0 && chars > 0)
    258238                                sig_sem(SEM_TCP_ECHO_SRV_SND_READY);
    259239
    260                         /* バッファå†
    261 ã«ç©ºããŒã‚れば、受信タスクを起床する。*/
     240                        /* バッファ内に空きがあれば、受信タスクを起床する。*/
    262241                        if (sizeof(buffer) - chars > 0)
    263242                                sig_sem(SEM_TCP_ECHO_SRV_RCV_READY);
     
    294273
    295274/*
    296  *  TCP ECHO サーバ受信ルーチン (ノンブロッキングコール使用)
     275 *  TCP ECHO サーバ受信ルーチン (ノンブロッキングコール使用)
    297276 */
    298277
     
    313292                }
    314293
    315         /* コネクション開設完了までå¾
    316 ã¤ã€‚*/
     294        /* コネクション開設完了まで待つ。*/
    317295        syscall(wai_sem(SEM_TCP_ECHO_SRV_RCV_READY));
    318296
    319         /* å¾
    320 ã£ã¦ã„る間にエラーになったら、コネクションの開設å¾
    321 ã¡ã«æˆ»ã‚‹ã€‚*/
     297        /* 待っている間にエラーになったら、コネクションの開設待ちに戻る。*/
    322298        if (rcv_error != E_OK)
    323299                return rcv_error;
     
    332308        while (true) {
    333309
    334                 /* 受信サイズを計算する。*/
     310                /* 受信サイズを計算する。*/
    335311                syscall(wai_sem(SEM_TCP_ECHO_SRV_LOCK));
    336312                if (sptr > rptr)
     
    340316                syscall(sig_sem(SEM_TCP_ECHO_SRV_LOCK));
    341317
    342                 /* 受信する。*/
     318                /* 受信する。*/
    343319                if ((error = tcp_rcv_dat(cepid, rptr, blen, TMO_NBLK)) != E_WBLK) {
    344320                        syslog(LOG_NOTICE, "[TES:%02d RCV] recv error = %s", cepid, itron_strerror(error));
     
    346322                        }
    347323
    348                 /* 受信バッファに空ができるまでå¾
    349 ã¤ã€‚*/
     324                /* 受信バッファに空ができるまで待つ。*/
    350325                syscall(wai_sem(SEM_TCP_ECHO_SRV_RCV_READY));
    351326
    352                 /* å¾
    353 ã£ã¦ã„る間に、受信文字数が 0 になるか、エラーになったら終了する。*/
     327                /* 待っている間に、受信文字数が 0 になるか、エラーになったら終了する。*/
    354328                if (rcv_error <= 0)
    355329                        break;
     
    357331                }
    358332
    359         /* 受信完了 */
     333        /* 受信完了 */
    360334        ena_rcv = false;
    361335
    362         /* 受信バッファに文字がå
    363 ¥ã‚‹ã®ã‚’å¾
    364 ã£ã¦ã„る送信タスクを起床する。*/
     336        /* 受信バッファに文字が入るのを待っている送信タスクを起床する。*/
    365337        if (chars == 0)
    366338                sig_sem(SEM_TCP_ECHO_SRV_SND_READY);
    367339
    368         /* コネクション切断完了までå¾
    369 ã¤ã€‚*/
     340        /* コネクション切断完了まで待つ。*/
    370341        syscall(wai_sem(SEM_TCP_ECHO_SRV_CLS_READY));
    371342
     
    374345
    375346/*
    376  *  TCP ECHO サーバ送信タスク (ノンブロッキングコール使用)
     347 *  TCP ECHO サーバ送信タスク (ノンブロッキングコール使用)
    377348 */
    378349
     
    395366                while (true) {
    396367
    397                         /* バッファに文字がå
    398 ¥ã‚‹ã¾ã§å¾
    399 ã¤ã€‚*/
     368                        /* バッファに文字が入るまで待つ。*/
    400369                        syscall(wai_sem(SEM_TCP_ECHO_SRV_SND_READY));
    401370
    402                         /* å¾
    403 ã£ã¦ã„る間にエラーになったら終了する。*/
     371                        /* 待っている間にエラーになったら終了する。*/
    404372                        if (snd_error <= 0)
    405373                                break;
    406374
    407                         /* 受信完了で、バッファに文字がなければ終了する。*/
     375                        /* 受信完了で、バッファに文字がなければ終了する。*/
    408376                        if (!ena_rcv && chars == 0)
    409377                                break;
    410378
    411                         /* 送信サイズを計算する。*/
     379                        /* 送信サイズを計算する。*/
    412380                        syscall(wai_sem(SEM_TCP_ECHO_SRV_LOCK));
    413381                        if (rptr > sptr)
     
    417385                        syscall(sig_sem(SEM_TCP_ECHO_SRV_LOCK));
    418386
    419                         /* 送信する。*/
     387                        /* 送信する。*/
    420388                        if ((error = tcp_snd_dat(cepid, sptr, blen, TMO_NBLK)) != E_WBLK) {
    421389                                syslog(LOG_NOTICE, "[TES:%02d SND] send error = %s", cepid, itron_strerror(error));
     
    424392                        }
    425393
    426                 /* 受信バッファに空ができるをå¾
    427 ã£ã¦ã„る受信タスクを起床する。*/
     394                /* 受信バッファに空ができるを待っている受信タスクを起床する。*/
    428395                if (chars == sizeof(buffer))
    429396                        sig_sem(SEM_TCP_ECHO_SRV_SND_READY);
     
    446413
    447414/*
    448  *  TCP ECHO サーバ受信ルーチン
     415 *  TCP ECHO サーバ受信ルーチン
    449416 */
    450417
     
    483450        while (true) {
    484451
    485                 /* 受信サイズを計算する。*/
     452                /* 受信サイズを計算する。*/
    486453                syscall(wai_sem(SEM_TCP_ECHO_SRV_LOCK));
    487454                if (sptr > rptr)
     
    491458                syscall(sig_sem(SEM_TCP_ECHO_SRV_LOCK));
    492459
    493                 /* 受信する。*/
     460                /* 受信する。*/
    494461                if ((rlen = tcp_rcv_dat(cepid, rptr, blen, TMO_FEVR)) <= 0) {
    495462                        if (rlen < 0)
     
    509476                syscall(wai_sem(SEM_TCP_ECHO_SRV_LOCK));
    510477
    511                 /* 受信ポインタを進める。*/
     478                /* 受信ポインタを進める。*/
    512479                if (rptr - buffer + rlen >= sizeof(buffer))
    513480                        rptr -= sizeof(buffer) - rlen;
     
    515482                        rptr += rlen;
    516483
    517                 /* バッファå†
    518 ã®æ–‡å­—数を増やす。*/
     484                /* バッファ内の文字数を増やす。*/
    519485                last   =     chars;
    520486                chars += (uint16_t)rlen;
    521487
    522                                 /* バッファå†
    523 ã«æ–‡å­—がå
    524 ¥ã‚Œã°ã€é€ä¿¡ã‚¿ã‚¹ã‚¯ã‚’起床する。*/
     488                                /* バッファ内に文字が入れば、送信タスクを起床する。*/
    525489                if (last == 0 && chars > 0)
    526490                        sig_sem(SEM_TCP_ECHO_SRV_SND_READY);
    527491
    528                                 /* バッファå†
    529 ã«ç©ºããŒã‚れば、受信タスクを起床する。*/
     492                                /* バッファ内に空きがあれば、受信タスクを起床する。*/
    530493                if (sizeof(buffer) - chars > 0)
    531494                        sig_sem(SEM_TCP_ECHO_SRV_RCV_READY);
     
    533496                syscall(sig_sem(SEM_TCP_ECHO_SRV_LOCK));
    534497
    535                 /* バッファに空きができるまでå¾
    536 ã¤ã€‚*/
     498                /* バッファに空きができるまで待つ。*/
    537499                syscall(wai_sem(SEM_TCP_ECHO_SRV_RCV_READY));
    538500                }
    539501
    540         /* 受信完了 */
     502        /* 受信完了 */
    541503        ena_rcv = false;
    542504
    543         /* 受信バッファに文字がå
    544 ¥ã‚‹ã®ã‚’å¾
    545 ã£ã¦ã„る送信タスクを起床する。*/
     505        /* 受信バッファに文字が入るのを待っている送信タスクを起床する。*/
    546506        if (chars == 0)
    547507                sig_sem(SEM_TCP_ECHO_SRV_SND_READY);
    548508
    549         /* コネクションの切断が完了するまでå¾
    550 ã¤ã€‚*/
     509        /* コネクションの切断が完了するまで待つ。*/
    551510        syscall(wai_sem(SEM_TCP_ECHO_SRV_CLS_READY));
    552511
     
    555514
    556515/*
    557  *  TCP ECHO サーバ送信タスク
     516 *  TCP ECHO サーバ送信タスク
    558517 */
    559518
     
    579538                while (true) {
    580539
    581                         /* バッファに文字がå
    582 ¥ã‚‹ã¾ã§å¾
    583 ã¤ã€‚*/
     540                        /* バッファに文字が入るまで待つ。*/
    584541                        syscall(wai_sem(SEM_TCP_ECHO_SRV_SND_READY));
    585542
    586                         /* 受信完了で、バッファに文字がなければ終了する。*/
     543                        /* 受信完了で、バッファに文字がなければ終了する。*/
    587544                        if (!ena_rcv && chars == 0)
    588545                                break;
    589546
    590                         /* 送信サイズを計算する。*/
     547                        /* 送信サイズを計算する。*/
    591548                        syscall(wai_sem(SEM_TCP_ECHO_SRV_LOCK));
    592549                        if (rptr > sptr)
     
    612569                        syscall(wai_sem(SEM_TCP_ECHO_SRV_LOCK));
    613570
    614                         /* 送信ポインタを進める。*/
     571                        /* 送信ポインタを進める。*/
    615572                        if (sptr - buffer + slen >= sizeof(buffer))
    616573                                sptr -= sizeof(buffer) - slen;
     
    618575                                sptr += slen;
    619576
    620                         /* バッファå†
    621 ã®æ–‡å­—数を減らす。*/
     577                        /* バッファ内の文字数を減らす。*/
    622578                        last   =     chars;
    623579                        chars -= (uint16_t)slen;
    624580
    625                         /* 受信完了で、バッファに文字がなければ終了する。*/
     581                        /* 受信完了で、バッファに文字がなければ終了する。*/
    626582                        if (!ena_rcv && chars == 0) {
    627583                                syscall(sig_sem(SEM_TCP_ECHO_SRV_LOCK));
     
    629585                                }
    630586
    631                         /* バッファå†
    632 ã«æ–‡å­—があれば、送信タスクを起床する。*/
     587                        /* バッファ内に文字があれば、送信タスクを起床する。*/
    633588                        if (chars > 0)
    634589                                sig_sem(SEM_TCP_ECHO_SRV_SND_READY);
    635590
    636                         /* 受信可能で、バッファå†
    637 ã«ç©ºããŒã§ãã‚Œã°ã€å—信タスクを起床する。*/
     591                        /* 受信可能で、バッファ内に空きができれば、受信タスクを起床する。*/
    638592                        if (ena_rcv && last == sizeof(buffer) && sizeof(buffer) - chars > 0)
    639593                                sig_sem(SEM_TCP_ECHO_SRV_RCV_READY);
     
    642596                        }
    643597
    644                 /* 受信バッファに空ができるをå¾
    645 ã£ã¦ã„る受信タスクを起床する。*/
     598                /* 受信バッファに空ができるを待っている受信タスクを起床する。*/
    646599                if (chars == sizeof(buffer))
    647600                        sig_sem(SEM_TCP_ECHO_SRV_SND_READY);
     
    671624
    672625/*
    673  *  get_tcp_rep -- TCP 受付口を獲得する。
     626 *  get_tcp_rep -- TCP 受付口を獲得する。
    674627 */
    675628
     
    697650
    698651/*
    699  *  get_tcp_cep -- TCP 通信端点を獲得する。
     652 *  get_tcp_cep -- TCP 通信端点を獲得する。
    700653 */
    701654
     
    732685
    733686/*
    734  *  TCP ECHO サーバ受信タスク
     687 *  TCP ECHO サーバ受信タスク
    735688 */
    736689
Note: See TracChangeset for help on using the changeset viewer.