「なでしこv1」開発掲示板

なでしこv1のバグや要望を書き込む掲示板

@888■ (#2814) TCPで送信したデータがよく欠損する? - とけい (2017-09-21 20:11) /低 詳細求む!
【症状】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を見てゲームに反映

#-----------------------------------------------------------------------
TCPで送信したデータがよく欠損する? / とけい (2017-09-21 20:11) (#2814)/ 低 詳細求む!
  TCP通信の基本 / うぇいく (2017-09-21 21:53) (#2815)/ 低 詳細求む!
    「受信した時」の発生タイミング / とけい (2017-09-21 23:04) (#2816)/ 低 感謝
  解決 / クジラ飛行机 (2018-12-31 12:43) (#2871)/ 低 解決

(#2814)へ返信する:

👆お手数ですが、いたずら防止のために、「真夏」の読み方を記入してください。

編集時に使うキーを入力(省略可能)

画像ファイル(最大300KB)を添付可能