【症状】TCPで送信したデータがよく欠損する
【バージョン】1.562 windows10
ゲームに通信対戦モードをつけました。
nakonet.nakoを取込し、TCPサーバー、TCPクライアントを使用しています。
(サーバーとはTCPサーバー。クライアントとはTCPクライアント)
送信データは主にBASE64の文字列です。
ゲームはターン制で、ターン終了時に行動をまとめてBASE64にして送ります。
1回で1000字~2000字くらいになります。
これが、けっこうな確率で欠損して届きます。
データが途中で切れているようで、後半部分がなくなっています。
データによる再現性はなく、同じデータを再度送ってもらうと欠損なしで届くこともあります。
受け取ったデータをBASE64デコードしたものをログに残しているのですが、1055文字目の一定文字数で切れていました。
BASE64デコード前は1.3倍くらいの1440バイトほどだと思われます。
ちょうどパケット分割がどうとかいうサイズ(知識は聞きかじり)らへんだと思います。
なでしこの更新履歴に「2016/09/08 version 1.562
-- nakonet.dllのライブラリIndy10を最新版に更新。」とありますが
nakonet.dllに問題はないでしょうか。
それとも手探りでプログラムした受信データの処理がよくないのでしょうか。
それともTCPでの送受信ってこういうものなんでしょうか。
送受信部分のプログラムはおおむね下記のような雰囲気です。
#-----------------------------------------------------------------------
//BASE64エンコードして開始と終端記号をつける
●送信(txt)
base64とは変数
base64 = txtをBASE64エンコード
base64 = 「<{base64}>」
base64をクライアントで送信
サーバーの受信した時は~サーバーの受信データをサーバーで全送信
受信データとは変数
クライアントの受信した時は~
受信データ=受信データ & (クライアントで受信) //ためておく
//ゲームループから呼び出す(秒間20回ほど)
●受信処理
dataとは変数
data = 受信データ
受信データ=「」//ローカル変数に移して速やかに消す
base64とは変数
txtとは変数
(data<>「」)でループ
base64 = dataの「<」から「>」まで範囲切り取る
//「>」がない場合、最後まで切り取る。
//欠損している場合、「>」がない
txt=base64をBASE64デコード
//txtを見てゲームに反映
#-----------------------------------------------------------------------