度々お世話になってます。
VB6.0、Winsockで、チャットプログラムを作っているのですが・・・
20文字のヘッダーで、処理が識別されるプログラムを作っているんですが、1460バイトを超えるデータが途中で切れて、ヘッダー無しの状態になって、処理を識別できないんですが・・・。
1460という数字は、DataArrivalのbytesTotalで調べたのですが、制御コード(のバイト数)とか、決まっているのでしょうか?
Send メソッドで通信する場合、一度に送るサイズを1460バイトにしたいのですが、サーバ←→クライアント間で、自力で作るしかないですかね・・・?
データを分割して、配列 myArray(partNum) にする。 先ほどと同じ処理のACKをクライアントが受信したら、partNumを+1して、データを送信。
client.SendData <処理A> 1:○○
server.GetData <A> 1:○○
server.SendData <A> 1:ACK
client.SendData <A> 2:●●
・
・
・
client.SendData <A> 9999:End
方向性はあってますかね?
なにか、楽な方法ありませんか?(汗)
cf.
http://bbs.wince.ne.jp/ch1/mqbbs.cgi?MODE=MSG&NU …
http://bbs.wince.ne.jp/ch1/mqbbs.cgi?&FILE=bbs.l …
No.1ベストアンサー
- 回答日時:
>途中で切れて、ヘッダー無しの状態になって、処理を識別できないんですが・・・。
TCPはそういうものなんですが・・・(^^;
WinSockコントロールでいうところのDataArrivalイベントにおいて、クライアントから送られたデータが1回(のイベント)で処理できるという保証はありません。
極端な話「こんにちわ」と送っても「こん」「にちわ」と届くかもしれない、ということです。(順序は保証されているので、繋げれば必ず「こんにちわ」になります)
>1460という数字は、DataArrivalのbytesTotalで調べたのですが
MTUとかRWINとか、ADSL初期の頃話題になった「ウインドウサイズ」という言葉がわかりやすいと思います。
簡単に言うと、そのI/F(LANカードとか)がどのくらいのパケットを一度で受け取れるか、を示します。これは変更可能ですが、そもそもTCPというのは「細切れでデータを送ってくる」ものですから、これを変えるのはナンセンスだと思います(^^;
DataArrivalでデータを受け取ったら、バッファに追加。そこでフッタデータが見つかればそこまでのバッファを処理データとして、バッファからその部分を消去し、処理データを処理する。
バイナリデータ送受信の場合、バイナリデータとヘッダ・フッタデータが被ることが考えられるので、ヘッダに「今から***Byteのデータを送る」ということを明記させる仕様にする。
こんな感じではないでしょうか。
勉強になりました。
今までたまたま処理する文字数が少なかったので、大丈夫だったのですね(汗)
アドバイスどうもありがとうございます。
ただ、バッファの構造が分かりません(汗)
ヘッダーとフッタの間は、どうやって判別するのですか?
複数処理(BBSとChatなど)のデータが来たら、混じってしまう?のでは?
小包(?)ごとに、ヘッダーが必要になるのかな?なんて思ってしまいました。
初歩的なことを聞いてすみません。。。
↓こんなのありました。
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/ …
No.2
- 回答日時:
# まだ見てるかどうか分かりませんが(^^;
>ただ、バッファの構造が分かりません(汗)
それは(VBプログラマであれば)意識する必要はないと思いますが・・・(^^;
それを作る(プロトコルを設計する)のは自分ですよ。
>ヘッダーとフッタの間は、どうやって判別するのですか?
データの流れとしては、必ず「ヘッダ~データ~フッタ」という感じになるはずです。(フッタは必ずしも必要ではありません。というか要らないか。)
また、「↓こんなのありました。」で紹介されているURLや先の回答で書きましたとおり、ヘッダにデータのサイズを埋め込んでおけば、ヘッダデータを受信してあとはそのサイズだけバッファを処理すればいいですね。
>複数処理(BBSとChatなど)のデータが来たら、混じってしまう?のでは?
例えば、Aさんが「こんにちわ」Bさんが「どういたしまして」というデータをサーバに送ったとします。
このとき、データを繋げると
「こんにちわどういたしまして」
「どういたしましてこんにちわ」
の、どちらかに必ずなります。
どちらが先に送ったか、という順番は、TCPでは保証されませんが、Send()で送った分のデータの塊分は、細切れになっていても必ずこの順で届きます。
ですので「混じらないようにプロトコルを設計する」というのが正しい解答です(^^;
# 「チャット プロトコル」あたりのキーワードで検索してみましょう
>小包(?)ごとに、ヘッダーが必要になるのかな?なんて思ってしまいました。
1回のSend()ごとにヘッダが必要になる、ということでしたらそのとおりです。
昨日、アドバイスを頂いてから、今まで考えていましたが、バッファデータが「混じらないようにプロトコルを設計する」って難しいですね。実際にコーディングして試行錯誤してみます。
>このとき、データを繋げると
>「こんにちわどういたしまして」
>「どういたしましてこんにちわ」
>の、どちらかに必ずなります。
分かりやすい例をありがとうございます。
私の分かりにくい質問にもかかわらず、2回もアドバイスしていただいて、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 現在プログラムを作っているのですが、実行したときに写真のように結果が表示されるのですが、これを CH 2 2023/01/18 16:22
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- IT・エンジニアリング 不具合の現状認識をしないプログラマって信用できる人? できない人? 8 2023/07/28 09:09
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
配列でデータが入っている要素...
-
ブレーカー落ちで壊れたりしな...
-
多量のSUMIF式を軽くしたい
-
プログラミング python pandas ...
-
この行は既に別のテーブルに属...
-
CString型の文字列連結について
-
0が含まれる幾何平均が「#NUM!」
-
EXCELVBAでSQLserverからデータ...
-
VBAを使ってOutlookメール本文...
-
VBA 毎日取得するデータを順番...
-
[C言語] コメント文字列を無視...
-
データ・BSS セグメントが分か...
-
VBとExcelオブジェクト
-
曲線グラフからピーク値を求め...
-
win7でvbsファイルが実行できない
-
csvファイルに複数行あるデ...
-
Accessで該当データにフラグを...
-
チェックサムの実装方法について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
配列でデータが入っている要素...
-
【エクセル】測定時間がバラバ...
-
メモ帳(テキストデータ)をExc...
-
この行は既に別のテーブルに属...
-
VBAを使ってOutlookメール本文...
-
VBA 空白セルを削除ではない方...
-
S9タイプからXタイプにデータ...
-
多量のSUMIF式を軽くしたい
-
Accessで該当データにフラグを...
-
[C言語] コメント文字列を無視...
-
[エクセル]データの個数が2番目...
-
エクセルで2つの時系列のデー...
-
特定のデータの抽出方法を教え...
-
外部データの更新がうまくでき...
-
ActiveReportについて
-
CString型の文字列連結について
-
ユーザーフォームのテキストボ...
-
カンマからスラッシュに
-
シーケンサにパソコンからアク...
おすすめ情報