HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
1220
hitochan複数の変数を連続して送信7解決


hitochan

リンク

2006/12/20(Wed) 16:43:18|NO.4245

沢山質問して申し訳ありません。
早速なのですが、
pcbnet2で違う変数を連続して受送信したいのですが、


サーバー tcpput a,soc tcpput b,soc クライアント tcpget a,64,soc tcpget b,64,soc mes a mes b
このようにすると変数bもクライアントの変数aに代入されてしまいます。
そこでtcpputとtcpgetのそれぞれにwait 10を入れると分かれて、
送受信(代入)されます。
しかしこれでは通信のスピードが遅くなってしまいます。
どうしたらよいでしょうか。



この記事に返信する


kanzaki

リンク

2006/12/21(Thu) 00:50:59|NO.4267

確かにその様な事が発生しますね。
解決方法は、大きく分けて2種類在ります。

・同期する方法
 例えば…
 サーバーは、データーを送信した後、クライアントからのパケットを受信待機する。
 クライアントは、データーを受信したあと、受信の報告サーバーへ送信する
 サーバーは、受信の報告を受け取ったら、次の内容を送信します。

・データーに規則を持たせる方法
 例えば…
 データーの先頭4バイトに、データーサイズを付加します(ヘッダ)。
 例:naiyou=strf("%04d",strlen(naiyou))+naiyou (文字列の場合)
 tcpget命令で、先頭4バイトで大きさを確認し、再度tcpgetで、そのサイズ分を読み込みます。
 指定したサイズよりも、受信バイト数が少ないときは、残りを再度受信します。
 また、大きな変数を作成しており、一気にそこにへ読み込んでおいてから
 strmidなどで読み込んだ方が、IPヘッダー分だけ高速化できます。
 サイズがわかっているので、その後ろの内容は次の変数の物。という事に成ります。



どちらの方法にも、通信が上手くいかなかった場合の制御を考えておきましょう
(考えるのは、とりあえず完成した後でも良いと思います。)

なお、同期しない方が、高速な通信が得られるような気がします。
実は、インターネット上の通信の多くは、上で述べたような手法をとっています。
参考になればと思います。



hitochan

リンク

2006/12/21(Thu) 23:08:59|NO.4306

>・データーに規則を持たせる方法
あまり関係ない話になってしまいますが、
strf関数というのは書式付き文字列に変換する関数と調べて分かったのですが、
いまいち分かりません。書式付き文字列とは具体的にどういう意味なんですか?



kanzaki

リンク

2006/12/21(Thu) 23:53:54|NO.4310

strfで、数列を文字列化して送信しているだけですが
桁数がいつでも同じように、「4桁の10進数」と指定しています。
10進数は、日常で使用する数字の体系ですから、10進数の部分は無視してください。


http://kanzaki.dip.jp/hsp/
に具体的なスクリプトを用意してみました。

スクリプトの内容としては、
サーバー側では、TestText の配列変数を連続的に送信して
クライアント側では、TestText の配列変数に読み込んでいきます。
完了後、デバッグウィンドウで確認してみてください。

サーバー側では、送信に際してクライアントが受信できているかは、構わず送信しています。
これは、非同期に送信しているといえます。
クライアントの受信に関しては、tcpfail で送信の同期は取っているものの
何バイトづつ受信するかを、指定しながら受信しています。


このような手法を使用すると、連続的な送信も可能となります
ある種の“プロトコル”です。



hitochan

リンク

2006/12/22(Fri) 23:16:10|NO.4337

しつこいようですいませんが、
strf関数で四桁ではなくて二桁でもよいのですか?
あと、
クライアント側の
tcpget s,5,soc
はなぜ
tcoget s,4,socではないのですか?



kanzaki

リンク

2006/12/23(Sat) 01:53:26|NO.4342

>strf関数で四桁ではなくて二桁でもよいのですか?

ここは自由に決定する部分になります。
あくまでも1例を示したに過ぎません。

ところで、10進数と16進数と2進数と言うのは知っていますか?
これを知っていると、もっと工夫が出来るようになります。




>なぜ
>tcoget s,4,socではないのですか?
ということですが、
tepgetの説明に
>p2には受信する最大サイズ(バッファのサイズ)を指定します.ただし,
>このサイズは [NULL文字を含めたサイズ] で指定します.通常は変数の
>サイズを指定するだけで良いです.
>tcprecv命令と違い,データの最後に [NULL文字が付加されます.]
と記述されております。
データの最後にNULL(つまり、asciiコードで"00")が、付加されるそうです。
そのサイズも含めて記述するように成っております為、指定する受信サイズが増えるのです。
tcpget a,1,socket
だと、何も受信されず、aの中身は""と成ります。
"0006abcdefg"の文字列を、
tcpget a,5,socket
で受信した場合は、"0006"で、
ascii文字コードで、30,30,30,36,00 (16進数表記)と成ります。

何故そういう仕様なのかは存じ上げませんが、そのような仕様です。



kanzaki

リンク

2006/12/23(Sat) 05:02:25|NO.4344

受信待ちの処理に関して、少々勘違いがありました。
その処理を変更をしたサンプルを置いておきます。

また、同期した送受信のサンプルも置いておきます。
こちらの、受信待ちの処理は適当ですから、前者の処理方法のように
修正する必要があるかもしれませんね。(全く同じ処理は不可能ですが…)

少しでも参考になれば…と思います。

このような基本の処理に、
エラー訂正処理(通信の異常や、予期しないデーターの受信に関しての処理と、破損データーの復旧)
データー暗号化、データー圧縮、等などを追加できれば
より安定・堅牢な高度な通信が出来るように成ると思います。



hitochan

リンク

2006/12/23(Sat) 10:52:15|NO.4348

>ところで、10進数と16進数と2進数と言うのは知っていますか?
大体は知っています。
詳しく教えて頂きありがとうございました!



ONION software Copyright 1997-2023(c) All rights reserved.