質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
RTOS

RTOS(リアルタイムOS)は、リアルタイムシステムのためのOSです。実時間システムや実時間OSとも呼ばれ、時間的な制限のある処理を行うための機能・特性を備えています。組み込みシステムの制御に多く用いられています。

TRON

TRONは、国産OSであり、CPUやOS、作業環境などを含む総合的コンピューターシステムの標準化を目指すプロジェクトでもあります。リアルタイムOS仕様の策定など使用目的に分けたアーキテクチャー設計が行われており、家電製品や自動車、携帯電話などに使用されています。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

解決済

NortiTCPプロトコルスタックにおいて相手側からのFIN受信を知る方法

eleele28
eleele28

総合スコア17

RTOS

RTOS(リアルタイムOS)は、リアルタイムシステムのためのOSです。実時間システムや実時間OSとも呼ばれ、時間的な制限のある処理を行うための機能・特性を備えています。組み込みシステムの制御に多く用いられています。

TRON

TRONは、国産OSであり、CPUやOS、作業環境などを含む総合的コンピューターシステムの標準化を目指すプロジェクトでもあります。リアルタイムOS仕様の策定など使用目的に分けたアーキテクチャー設計が行われており、家電製品や自動車、携帯電話などに使用されています。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

1回答

0リアクション

1クリップ

409閲覧

投稿2022/05/27 07:52

前提

Norti ver.4(μITRON系RTOS)を使って組込み制御プログラムを作っています。
Nortiにはミスポ製のTCP/IPプロトコルスタックが含まれているため、
今回はそれを用いてTCP通信を行います。

実現したいこと

今回作成するプログラムはTCPのサーバ側(リッスンする側)なので、
プログラム起動したらソケット(Nortiでは「通信端点」と呼ぶ)を作成し、
プロトコルスタックのAPI、tcp_acp_cep()を呼び出して当該通信端点のリッスンを開始します。
通信相手(クライアント側)からSYNが送信されてきたらプロトコルスタック内で自動的に3wayハンドシェイクが実施されてTCPコネクションがなされ、データの送受信を行います。
データ送受信が終了し、相手側からFINやRSTが送信されてきたら(もしくは回線が物理断したら)通信端点を閉じて、
次の接続に備えて再度tcp_acp_cep()を呼び出してリッスンに戻りたいです。

わからないこと

NortiのTCP/IPプロトコルスタックは、様々なイベントを通信端点に紐付けたコールバックルーチンで教えてくれて重宝しているのですが、
プロトコルスタックのマニュアルを熟読しても
「通信相手からFINやRSTが送信されてきて、TCP接続を切断したこと」「回線が物理的に切れてしまいTCP接続を切断したこと」
をコールバックで知る手段の記述が無く、どう設計すればいいか困っています。
※自分から切断しに行った場合(API・tcp_cls_cep()を呼び出した場合)の切断完了をコールバックで教えてくれる旨は記載があるのですが、相手から一方的に切られたことを知る方法の記載が見つかりません。

相手から接続が切断されたことを知ることが出来ないと、tcp_acp_cep()を呼び出してのリッスン再開が出来ず、通信端点が1回きり使いすてになってしまいます。
TCP接続が切断されたことを受動的に知るにはどうすればよいのでしょうか?

該当のソースコード

ざっくりサンプルコードを書いてみました。
今回はC言語で開発しています。
(エラーハンドリングなどは省略しています)

C言語

/* * コールバックからの受け渡し情報用グローバル変数 */ ID rcvCep; /* 受信CEP格納用 */ FN rcvFnCd; /* 受信機能コード格納用 */ /* 受信する機能コードの種類はマニュアルによると以下の通り TFN_TCP_ACP_CEP (-0x205) tcp_acp_cep 完了通知 TFN_TCP_CON_CEP (-0x206) tcp_con_cep 完了通知 TFN_TCP_CLS_CEP (-0x208) tcp_cls_cep 完了通知 TFN_TCP_SND_DAT (-0x209) tcp_snd_dat 完了通知 TFN_TCP_RCV_DAT (-0x20a) tcp_rcv_dat 完了通知 TFN_TCP_GET_BUF (-0x20b) tcp_get_buf 完了通知 TFN_TCP_RCV_BUF (-0x20d) tcp_rcv_buf 完了通知 TFN_UDP_SND_DAT (-0x223) udp_snd_dat 完了通知 TFN_UDP_RCV_DAT (-0x224) udp_rcv_dat 完了通知 */ /* * メインルーチン */ int mainRoutine(){ T_TCP_CREP pk_crep; /* TCP受付口生成情報 */ ID repid; /* TCP受付口ID */ T_TCP_CCEP pk_ccep; /* TCP通信端点生成情報パケット */ ID cepId; /* TCP通信端点ID */ T_IPV4EP distAddr; /* 接続受付アドレス情報 */ TMO tmout; /* タイムアウト指定 */ // //~~~このあたりに変数の初期化処理~~~ // /* TCP受付口生成呼び出し*/ tcp_cre_rep(repid, &pk_crep); /* TCP通信端点生成のシステムコール呼び出し */ tcp_cre_cep(cepId, &pk_ccep); /* リッスン開始 */ tcp_acp_cep(cepId, repid, &distAddr, tmout); // メインループ while(1){ //コールバックからのイベント通知を待つ(コールバック発生までここでブロッキングのイメージ) waitMsg(); /* サービスコールの機能コードに応じて分岐 */ switch(rcvFnCd) { //クローズ完了 case TFN_TCP_CLS_CEP: //クローズ完了したら再度リッスン開始 tcp_acp_cep(cepId, repid, &distAddr, tmout); break; //送信完了 case TFN_TCP_SND_DAT: //送信完了時の処理省略 break; //受信完了 case TFN_TCP_RCV_DAT: //受信完了時の処理省略 break; // //~~~ このあたりでcaseの一つとして、相手からのコネクション切断を判断できないか?~~~ // default: break; } } return 0; } /* * Nortiからのコールバック関数 */ void callback(ID cepId, FN fnCd, VP parblk) { /* 受信CEPをセット */ rcvCep = cepId; /* 機能コードを格納 */ rcvFnCd = fnCd; /* イベント発生をmainRoutineに通知 */ sendMsg(); return; }

補足情報

OS:Norti ver4

・NortiTCP/IPプロトコルスタックのマニュアルPDF
http://www.mispo.co.jp/document/n4nguid.pdf

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

thkana

2022/05/28 08:00

Nortiは有償の商品だったと思いますが、メーカーではサポートしてくれないのですか?

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

RTOS

RTOS(リアルタイムOS)は、リアルタイムシステムのためのOSです。実時間システムや実時間OSとも呼ばれ、時間的な制限のある処理を行うための機能・特性を備えています。組み込みシステムの制御に多く用いられています。

TRON

TRONは、国産OSであり、CPUやOS、作業環境などを含む総合的コンピューターシステムの標準化を目指すプロジェクトでもあります。リアルタイムOS仕様の策定など使用目的に分けたアーキテクチャー設計が行われており、家電製品や自動車、携帯電話などに使用されています。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。