source: asp3_gr_sakura/trunk/tinet/asp_sample/echos4.c@ 318

Last change on this file since 318 was 318, checked in by coas-nagasima, 7 years ago

プロパティの文字コードにUTF-8を追加、キーワードを削除

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc; charset=UTF-8
File size: 15.2 KB
Line 
1/*
2 * TINET (TCP/IP Protocol Stack)
3 *
4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering
5 * Tomakomai National College of Technology, JAPAN
6 *
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プロジェクトを免責すること.
25 *
26 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
27 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
28 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
29 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
30 *
31 * @(#) $Id$
32 */
33
34/*
35 * IPv4、TCP ECHO サーバ、送受信タスク同一型
36 */
37
38#include <string.h>
39
40#include <kernel.h>
41#include <t_syslog.h>
42#include "kernel_cfg.h"
43#include "tinet_cfg.h"
44
45#include <tinet_config.h>
46
47#include <netinet/in.h>
48#include <netinet/in_itron.h>
49#include <netinet/tcp.h>
50
51#include "echos4.h"
52
53/*
54 * 外部関数の定義
55 */
56
57extern const char *itron_strerror (ER ercd);
58
59/*
60 * 注意:
61 *
62 * BUF_SIZE は TCP の
63 * 送信ウインドウバッファサイズ + 受信ウインドウバッファサイズの
64 * 3/2 倍以上の大きさがなければ、デッドロックする可能性がある。
65 */
66
67#define BUF_SIZE ((TCP_ECHO_SRV_SWBUF_SIZE + \
68 TCP_ECHO_SRV_RWBUF_SIZE) * 3 / 2)
69
70static T_IPV4EP dst;
71
72#ifdef USE_TCP_NON_BLOCKING
73
74static ER nblk_error = E_OK;
75static ER_UINT nblk_slen = 0;
76static ER_UINT nblk_rlen = 0;
77
78#endif /* of #ifdef USE_TCP_NON_BLOCKING */
79
80#ifndef USE_COPYSAVE_API
81
82static uint8_t buffer[BUF_SIZE];
83
84#endif /* of #ifndef USE_COPYSAVE_API */
85
86/*
87 * TCP 送受信バッファ
88 */
89
90uint8_t tcp_echo_srv_swbuf[TCP_ECHO_SRV_SWBUF_SIZE];
91uint8_t tcp_echo_srv_rwbuf[TCP_ECHO_SRV_RWBUF_SIZE];
92
93#ifdef USE_TCP_NON_BLOCKING
94
95/*
96 * ノンブロッキングコールのコールバック関数
97 */
98
99ER
100callback_nblk_tcp_echo_srv (ID cepid, FN fncd, void *p_parblk)
101{
102 ER error = E_OK;
103
104 switch (fncd) {
105
106 case TFN_TCP_ACP_CEP:
107 nblk_error = *(ER*)p_parblk;
108 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
109 break;
110
111 case TFN_TCP_RCV_DAT:
112 if ((nblk_rlen = *(ER_UINT*)p_parblk) < 0)
113 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) CBN] recv err: %s", itron_strerror(nblk_rlen));
114 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
115 break;
116
117 case TFN_TCP_SND_DAT:
118 if ((nblk_slen = *(ER_UINT*)p_parblk) < 0)
119 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) CBN] send err: %s", itron_strerror(nblk_slen));
120 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
121 break;
122
123 case TFN_TCP_CLS_CEP:
124 if ((nblk_error = *(ER*)p_parblk) < 0)
125 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) CBN] clse err: %s", itron_strerror(nblk_error));
126 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
127 break;
128
129 case TFN_TCP_RCV_BUF:
130 if ((nblk_rlen = *(ER_UINT*)p_parblk) < 0)
131 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) CBN] rbuf err: %s", itron_strerror(nblk_rlen));
132 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
133 break;
134
135 case TFN_TCP_GET_BUF:
136 if ((nblk_slen = *(ER_UINT*)p_parblk) < 0)
137 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) CBN] sbuf err: %s", itron_strerror(nblk_slen));
138 syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
139 break;
140
141 case TFN_TCP_CON_CEP:
142 case TFN_TCP_SND_OOB:
143 default:
144 error = E_PAR;
145 break;
146 }
147 return error;
148 }
149
150#ifdef USE_COPYSAVE_API
151
152void
153tcp_echo_srv_task(intptr_t exinf)
154{
155 T_IN4_ADDR addr;
156 ID tskid;
157 ER error = E_OK;
158 uint32_t total;
159 uint16_t rblen, sblen, rlen, slen, soff, count;
160 char *rbuf, *sbuf;
161
162 get_tid(&tskid);
163 addr = IPV4_ADDR_LOCAL;
164 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK):%d,%d] (copy save API) started, IP Address: %s.",
165 tskid, (ID)exinf, ip2str(NULL, &addr));
166 while (true) {
167 if ((error = tcp_acp_cep((int_t)exinf, TCP_ECHO_SRV_REPID, &dst, TMO_NBLK)) != E_WBLK) {
168 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] error: %s", itron_strerror(error));
169 continue;
170 }
171
172 /* 相手から接続されるまで待つ。*/
173 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
174
175 if (nblk_error == E_OK)
176 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] connected from %s:%d", ip2str(NULL, &dst.ipaddr), dst.portno);
177 else {
178 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] error: %s", itron_strerror(nblk_error));
179 continue;
180 }
181
182 total = rlen = count = 0;
183 while (true) {
184 if ((error = tcp_rcv_buf((int_t)exinf, (void **)&rbuf, TMO_NBLK)) != E_WBLK) {
185 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) RCV] error: %s", itron_strerror(error));
186 break;
187 }
188
189 /* 受信するまで待つ。*/
190 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
191
192 if (nblk_rlen < 0) { /* エラー */
193 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) RCV] error: %s", itron_strerror(nblk_rlen));
194 break;
195 }
196 else if (nblk_rlen == 0) /* 受信終了 */
197 break;
198
199 rblen = (uint16_t)nblk_rlen;
200
201 /* バッファの残りにより、受信長を調整する。*/
202 if (rblen > BUF_SIZE - rlen)
203 rblen = BUF_SIZE - rlen;
204
205 total += rblen;
206 rlen = rblen;
207 count ++;
208 memcpy(buffer, rbuf, rblen);
209
210 if ((error = tcp_rel_buf((int_t)exinf, rlen)) < 0) {
211 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) REL] error: %s",
212 itron_strerror(error));
213 break;
214 }
215
216 soff = 0;
217 while (rlen > 0) {
218
219 if ((error = tcp_get_buf((int_t)exinf, (void **)&sbuf, TMO_NBLK)) != E_WBLK) {
220 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) GET] error: %s",
221 itron_strerror(error));
222 goto err_fin;
223 }
224
225 /* 送信バッファの獲得が完了するまで待つ。*/
226 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
227
228 if (nblk_slen < 0) {
229 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) GET] error: %s",
230 itron_strerror(nblk_slen));
231 goto err_fin;
232 }
233 else
234 /*syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) GET] len: %d", nblk_slen)*/;
235
236 sblen = (uint16_t)nblk_slen;
237 slen = sblen < rlen ? sblen : rlen;
238 memcpy(sbuf, buffer + soff, slen);
239
240 if ((error = tcp_snd_buf((int_t)exinf, slen)) != E_OK) {
241 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] error: %s",
242 itron_strerror(error));
243 goto err_fin;
244 }
245 /*syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] len: %d", slen);*/
246
247 rlen -= slen;
248 soff += slen;
249 }
250 }
251 err_fin:
252
253 if ((error = tcp_sht_cep((int_t)exinf)) != E_OK)
254 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SHT] error: %s", itron_strerror(error));
255
256 if ((error = tcp_cls_cep((int_t)exinf, TMO_NBLK)) != E_WBLK)
257 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) CLS] error: %s", itron_strerror(error));
258
259 /* 開放が完了するまで待つ。*/
260 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
261
262 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) FIN] finished, total count: %d, len: %d", count, total);
263 }
264 }
265
266#else /* of #ifdef USE_COPYSAVE_API */
267
268void
269tcp_echo_srv_task(intptr_t exinf)
270{
271 T_IN4_ADDR addr;
272 ID tskid;
273 ER error;
274 uint32_t total;
275 uint16_t rlen, slen, soff, count;
276
277 get_tid(&tskid);
278 addr = IPV4_ADDR_LOCAL;
279 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK):%d,%d] started, IP Address: %s.",
280 tskid, (ID)exinf, ip2str(NULL, &addr));
281 while (true) {
282 if ((error = tcp_acp_cep((int_t)exinf, TCP_ECHO_SRV_REPID, &dst, TMO_NBLK)) != E_WBLK) {
283 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] error: %s", itron_strerror(error));
284 continue;
285 }
286
287 /* 相手から接続されるまで待つ。*/
288 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
289
290 if (nblk_error == E_OK) {
291 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] connected from %s:%d",
292 ip2str(NULL, &dst.ipaddr), dst.portno);
293 }
294 else {
295 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] error: %s", itron_strerror(nblk_error));
296 continue;
297 }
298
299 count = total = 0;
300 while (true) {
301 if ((error = tcp_rcv_dat((int_t)exinf, buffer, BUF_SIZE - 1, TMO_NBLK)) != E_WBLK) {
302 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) RCV] error: %s",
303 itron_strerror(error));
304 break;
305 }
306
307 /* 受信完了まで待つ。*/
308 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
309
310 if (nblk_rlen < 0) {
311 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) RCV] error: %s",
312 itron_strerror(nblk_rlen));
313 break;
314 }
315 else if (nblk_rlen == 0)
316 break;
317
318 rlen = (uint16_t)nblk_rlen;
319 total += (uint32_t)nblk_rlen;
320 count ++;
321 soff = 0;
322 while (rlen > 0) {
323 if ((error = tcp_snd_dat((int_t)exinf, &buffer[soff], rlen, TMO_NBLK)) != E_WBLK) {
324 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] error: %s",
325 itron_strerror(error));
326 goto err_fin;
327 }
328
329 /* 送信完了まで待つ。*/
330 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
331
332 if (nblk_slen < 0) {
333 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] error: %s",
334 itron_strerror(nblk_slen));
335 goto err_fin;
336 }
337 else
338 /*syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] len: %4d", nblk_slen)*/;
339
340 slen = (uint16_t)nblk_slen;
341 rlen -= slen;
342 soff += slen;
343 }
344 }
345 err_fin:
346
347 if ((error = tcp_sht_cep((int_t)exinf)) != E_OK)
348 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SHT] error: %s", itron_strerror(error));
349
350 if ((error = tcp_cls_cep((int_t)exinf, TMO_NBLK)) != E_WBLK)
351 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) CLS] error: %s", itron_strerror(error));
352
353 /* 開放が完了するまで待つ。*/
354 syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY));
355
356 syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) FIN] finished, total cnt: %d, len: %d", count, total);
357 }
358 }
359
360#endif /* of #ifdef USE_COPYSAVE_API */
361
362#else /* of #ifdef USE_TCP_NON_BLOCKING */
363
364#ifdef USE_COPYSAVE_API
365
366void
367tcp_echo_srv_task(intptr_t exinf)
368{
369 T_IN4_ADDR addr;
370 ID tskid;
371 ER_UINT rblen, sblen;
372 ER error = E_OK;
373 uint32_t total;
374 uint16_t rlen, slen, soff, count;
375 char *rbuf, *sbuf;
376
377 get_tid(&tskid);
378 addr = IPV4_ADDR_LOCAL;
379 syslog(LOG_NOTICE, "[TCP ECHO SRV:%d,%d] (copy save API) started, IP Address: %s.",
380 tskid, (ID)exinf, ip2str(NULL, &addr));
381 while (true) {
382 if (tcp_acp_cep((int_t)exinf, TCP_ECHO_SRV_REPID, &dst, TMO_FEVR) != E_OK) {
383 syslog(LOG_NOTICE, "[TCP ECHO SRV ACP] error: %s", itron_strerror(error));
384 continue;
385 }
386
387 total = count = 0;
388 syslog(LOG_NOTICE, "[TCP ECHO SRV ACP] connected from %s:%d", ip2str(NULL, &dst.ipaddr), dst.portno);
389 while (true) {
390 if ((rblen = tcp_rcv_buf((int_t)exinf, (void **)&rbuf, TMO_FEVR)) <= 0) {
391 if (rblen != E_OK)
392 syslog(LOG_NOTICE, "[TCP ECHO SRV RCV] error: %s", itron_strerror(rblen));
393 break;
394 }
395
396 rlen = (uint16_t)rblen;
397 total += (uint32_t)rblen;
398 count ++;
399 soff = 0;
400 while (rlen > 0) {
401
402 if ((sblen = tcp_get_buf((int_t)exinf, (void **)&sbuf, TMO_FEVR)) < 0) {
403 syslog(LOG_NOTICE, "[TCP ECHO SRV GET] error: %s",
404 itron_strerror(sblen));
405 goto err_fin;
406 }
407 /*syslog(LOG_NOTICE, "[TCP ECHO SRV GET] len: %d", sblen);*/
408
409 slen = rlen < (uint16_t)sblen ? rlen : (uint16_t)sblen;
410 memcpy(sbuf, rbuf + soff, slen);
411 if ((error = tcp_snd_buf((int_t)exinf, slen)) != E_OK) {
412 syslog(LOG_NOTICE, "[TCP ECHO SRV SND] error: %s",
413 itron_strerror(error));
414 goto err_fin;
415 }
416 /*syslog(LOG_NOTICE, "[TCP ECHO SRV SND] len: %d", slen);*/
417
418 rlen -= slen;
419 soff += slen;
420 }
421
422 if ((error = tcp_rel_buf((int_t)exinf, rblen)) < 0) {
423 syslog(LOG_NOTICE, "[TCP ECHO SRV REL] error: %s", itron_strerror(error));
424 break;
425 }
426 }
427 err_fin:
428
429 if ((error = tcp_sht_cep((int_t)exinf)) != E_OK)
430 syslog(LOG_NOTICE, "[TCP ECHO SRV SHT] error: %s", itron_strerror(error));
431
432 if ((error = tcp_cls_cep((int_t)exinf, TMO_FEVR)) != E_OK)
433 syslog(LOG_NOTICE, "[TCP ECHO SRV CLS] error: %s", itron_strerror(error));
434
435 syslog(LOG_NOTICE, "[TCP ECHO SRV FIN] finished, total cnt: %d, len: %d", count, total);
436 }
437 }
438
439#else /* of #ifdef USE_COPYSAVE_API */
440
441void
442tcp_echo_srv_task(intptr_t exinf)
443{
444 T_IN4_ADDR addr;
445 ID tskid;
446 ER_UINT rlen, slen;
447 ER error = E_OK;
448 uint16_t soff, count, total;
449
450 get_tid(&tskid);
451 addr = IPV4_ADDR_LOCAL;
452 syslog(LOG_NOTICE, "[TCP ECHO SRV:%d,%d] started, IP Address: %s.",
453 tskid, (ID)exinf, ip2str(NULL, &addr));
454 while (true) {
455 if (tcp_acp_cep((int_t)exinf, TCP_ECHO_SRV_REPID, &dst, TMO_FEVR) != E_OK) {
456 syslog(LOG_NOTICE, "[TCP ECHO SRV ACP] error: %s", itron_strerror(error));
457 continue;
458 }
459
460 total = count = 0;
461 syslog(LOG_NOTICE, "[TCP ECHO SRV ACP] connected from %s:%d",
462 ip2str(NULL, &dst.ipaddr), dst.portno);
463 while (true) {
464 if ((rlen = tcp_rcv_dat((int_t)exinf, buffer, BUF_SIZE - 1, TMO_FEVR)) <= 0) {
465 if (rlen != E_OK)
466 syslog(LOG_NOTICE, "[TCP ECHO SRV RCV] error: %s",
467 itron_strerror(rlen));
468 break;
469 }
470
471 /*syslog(LOG_NOTICE, "[TCP ECHO SRV RCV] count: %4d, len: %4d, data %02x -> %02x",
472 ++ count, (uint16_t)rlen, *buffer, *(buffer + rlen - 1));*/
473 count ++;
474 total += (uint16_t)rlen;
475 soff = 0;
476 while (rlen > 0) {
477 if ((slen = tcp_snd_dat((int_t)exinf, &buffer[soff], rlen, TMO_FEVR)) < 0) {
478 syslog(LOG_NOTICE, "[TCP ECHO SRV SND] error: %s",
479 itron_strerror(slen));
480 goto err_fin;
481 }
482 /*syslog(LOG_NOTICE, "[TCP ECHO SRV SND] len: %d", slen);*/
483 rlen -= slen;
484 soff += (uint16_t)slen;
485 }
486 }
487 err_fin:
488
489 if ((error = tcp_sht_cep((int_t)exinf)) != E_OK)
490 syslog(LOG_NOTICE, "[TCP ECHO SRV SHT] error: %s", itron_strerror(error));
491
492 if ((error = tcp_cls_cep((int_t)exinf, TMO_FEVR)) != E_OK)
493 syslog(LOG_NOTICE, "[TCP ECHO SRV CLS] error: %s", itron_strerror(error));
494
495 syslog(LOG_NOTICE, "[TCP ECHO SRV FIN] finished, total cnt: %d, len: %d", count, total);
496 }
497 }
498
499#endif /* of #ifdef USE_COPYSAVE_API */
500
501#endif /* of #ifdef USE_TCP_NON_BLOCKING */
Note: See TracBrowser for help on using the repository browser.