シェルティさん
いつもお世話になります
いろいろやりました、一つのことが課題でして
tcp_snd_datと tcp_rcv_datはcallbackの中で使用可能ということで
このことはtcp_snd_datのすぐ後にtcp_rcv_datする
tcp_rcv_datのすぐ後にtcp_snd_datということで良くわかります
tcp_snd_datで1Byte送信これを続けさまに発信するなどうまくいきます
tcp_rcv_datの場合は相手方がデータが入らない場合は無理です
ということでcallbackの中で全てを処理すれば
telnetは即可能であると感じています
ただtelnetを構成する場合、
現在使用しているインタープリタに結合させたいと思っています
telnetから入力したコマンドラインをインタープリタに送信して
インタープリタから出力される文字列をtelnetに出力したいと思います
この場合callback外の箇所からtelnet送信を起動しないといけません
uIPの場合ですと、パケットがなくてもcallbackが常に一定間隔で呼ばれており
その呼ばれたタイミングでデータがある場合はtelnetに出力できます
t4ですとcallbackイベントがないと飛んできません
外部からtelnet出力を起動できますでしょうか?
インタープリタをcallback中に作りこめばできることはわかりますが、
そうなるとソフト作成が大変なことになるので
アドバイスでもいただけましたら、幸いです。
httpサーバーの方は画面が一応出ました、ファイルリストがブラウザーに表示されました、とりあえずご報告まで。
IKUZOさん
こんにちは、シェルティです。
なるほど、IKUZOさんが実現されたいことと合致するか少し不安ですが、callback処理外から送信することは可能です。
callbackではtcp_rcv_dat()を呼び出しておいて、インタプリター側が送信したくなったら、インタプリター側でtcp_rcv_dat()をキャンセルして、キャンセル完了のcallbackでtcp_snd_dat()を呼び出し、tcp_snd_dat()の完了で再度tcp_rcv_dat()を呼び出す、というものです。
キャンセルして送信している間も、TCP/IPライブラリ内部にある程度は(config_tcpudp.c のtcp_ccep構造体に設定した受信ウィンドウ分は)バッファリングされますので、キャンセル/送信中に受信データをこぼすこともありません。
この動作を実現しているサンプルがありますので参考にしてみてください。
https://www.renesas.com/mw/t4 ->画面下のほうのTCP/IPサンプルプログラム ->画面左のほうのサンプルプログラム ->RXファミリ 組み込み用TCP/IP M3S-T4-Tinyを用いたサンプルプログラム Firmware Integration Technology ->解凍データの奥底にある「tcp_nonblocking_cancel_sample」フォルダのecho_srv.c
また、ファイルリストがブラウザに表示されたとのことで、よかったです。
ネットワークはいろいろ難儀なところが多いので動き始めるとうれしさも大きいですね。
以上です
いつもありがとうございます
インタプリター側でtcp_rcv_dat()をキャンセルして、キャンセル完了のcallbackでtcp_snd_dat()を呼び出すとのことですが
キャンセル完了のcallbackというのが良くわからなくて、
サンプルではstrstrで<CRLF> checkをやってから送信しているので、この場所でコマンド解析というようなことですが
「インタプリター側でtcp_rcv_dat()をキャンセルして」具体的にはどのようにできますか?
サンプルコードによると、受信データが1秒以内に受信できない場合はキャンセルを発令するという意味のように取れますが
それで、受信のところtcp_rcv_dat(で停止することがないと受け取れますが、たぶんそうですよね、
その考え方でやってみたいと思います、
やってみましたがTFN_TCP_RCV_DAT:には1秒毎には来てくれませんね。
やはり外部から「インタプリター側でtcp_rcv_dat()をキャンセルして」やるひつようがあるようです。
シェルティさん、すみません、コードミスってました、今一度確認します。
シェルティさん、解りましたTFN_TCP_RCV_DAT:が外部から送信する窓口ですね、この線でやってみます。
できました、ありがとうございました。
こんにちは、シェルティです
おお、見事にインタプリタの入出力がtelnetに繋がっていますね。telnetサーバの通信端点を増やせば、複数人同時ログインもできると思います。
後発の方のために、IKUZOさんの疑問点(キャンセル動作)にも回答しておきたいと思います。
■前提条件(1)通常はmain()ループでプログラムカウンタが周回している(2)10ms周期タイマ割り込みまたは、Etherコントローラ割り込みを起点とし TCP/IPの処理が実行される。(必要に応じてTCP/IPからユーザにコールバックする)
■1通信端点での送信・受信同時動作(受信キャンセル動作の応用)(1)main()でまずはTCP接続の1回目の接続待ち受け(tcp_acp_cep())をノンブロッキングコール(2)TCP接続が完了するとコールバックが発生、イベントコードはTFN_TCP_ACP_CEPとなる。(3)TFN_TCP_ACP_CEPを伴ってコールバックが来たら、tcp_rcv_dat()を実行し 受信予約(インタプリタへのコマンド待ち)(4)TCP受信が完了するとコールバックが発生、イベントコードはTFN_TCP_RCV_DATとなる。(5)TFN_TCP_RCV_DATを伴ってコールバックが来たら、tcp_rcv_dat()で 指定した受信バッファポインタに受信データが入っているので これを取り出してインタプリタ側に送出、 続いてtcp_rcv_dat()を実行し受信予約(次のインタプリタへのコマンド待ち)(6)main()ではインタプリタの制御を行っており、(5)で詰め込まれたキューを監視しているとして、 キューに何かが入ってきたら、キューに登録されたコマンド処理を実行し、実行結果を 送信バッファに書き込み、tcp_can_cep()を使用して、(5)の受信をキャンセルする(7)キャンセルが完了するとコールバックが発生、イベントコードはTFN_TCP_RCV_DATとなる。(8)TFN_TCP_RCV_DATとエラーコード(E_RLWAI)を伴ってコールバックが来たら、 tcp_snd_dat()で(6)の送信バッファを指定して実行(9)TCP送信が完了するとコールバックが発生、イベントコードはTFN_TCP_SND_DATとなる。(10)TFN_TCP_SND_DATを伴ってコールバックが来たら、tcp_rcv_dat()で再度受信待ちする 一見(6)~(10)の間に受信したデータは取りこぼしそうですが、TCP/IP内部の受信ウィンドウに 自動的に保持されACKが返る(溢れた分もEtherコントローラに数KBは保持される模様、 これも溢れて本当に受信データが破棄されてもTCPの再送制御で通信相手は もう一度同じデータを送ってくる)ので、受信データが消えてしまうことはありません。 以上です
管理人です。
TCP/IPのデモおよびアプリケーションノートに関して、利用中止の注意がルネサスHPに掲載されていますのでご注意ください。
<件名>オープンソースソフトウェアの TCP/IP プロトコルスタックを用いた Ethernet 通信デモンストレーションおよびアプリケーションノートの利用中止について<URL>https://www.renesas.com/jp/ja/document/oth/renesas-response-uip-open-source-tcp-ip-stacks-vulnerability-issue
よろしくお願いします。
利用中止も致し方無いですね
telnet等今どきインターネットに繋ぐ人もいなでしょうし
実験程度ならともかくルネサス社として商用利用するには無理があると思いましたから
納得いきます。