Winsock(TCP)を用い、任意のデータ長で複数ストリームを送信するには?

解決


ひげ  2002-11-20 09:36:05  No: 76411  IP: [192.*.*.*]

WinsockコントロールでTCPを使用した場合で奇怪な現象に陥ってしまいます。
こういう場合で、、、(※TCPは既にはれているものとします)

public data() as byte

public sub あくしょん()
   redim data(46) as byte
   ******このあとデータを(0)〜(40)まで挿入*******
   winsock1.senddata data '一発目はここで送信
   dim i as integer
   for i = 0 to 1000
       ****データ(41)〜(45)を一回送信終える毎に一つ数値をあげる****
       winsock1.senddata data
       doevents
   next i
end sub

このソースで一発目は正常に流れます。
しかし、二発目以降はなんらか悪さ?しているらしく、
二発目のデータの後ろにすぐ三発目、、、などの様にデータが肥大し、
Ethernetに送信される状態ではフラグメントされ異常なパケットと
なってしまいます。そこで、正常なデータ長でこのように複数ストリームを
円滑に送信するにはどのようにすれば宜しいでしょうか?
どなたか教えていただきたく。
(DoS目的ではありません。検証用です。)

編集 削除
YuO  2002-11-20 10:22:58  No: 76412  IP: [192.*.*.*]

データ境界が維持されない,ということですか?
ストリームはそういうものです。データグラムを使ってください。

編集 削除
ひげ  2002-11-20 22:42:27  No: 76413  IP: [192.*.*.*]

TCPで通信するうえは避けられない?
という事でしょうか?やはりUNIXかCじゃないと
だめなのかな、、、、

編集 削除
YuO  2002-11-20 23:39:32  No: 76414  IP: [192.*.*.*]

UNIXだろうがWinSockを直に(C等で)扱おうが,TCPである以上一緒です。
TCPというものがどのようなものか,勉強し直してみるとよいでしょう。

編集 削除
ひげ  2002-11-21 21:47:42  No: 76415  IP: [192.*.*.*]

実際、VCで実現している(Snifferで見ると数ミリ秒の誤差で)アプリが
ありますが、なんらか策がある?のでしょうか?

編集 削除
YuO  2002-11-22 00:21:54  No: 76416  IP: [192.*.*.*]

一応,あることはあるのですが……。
#Nagleアルゴリズム(RFC 896)を無効化するオプション。

まずは,データ境界が維持されないことは,
> 奇怪な現象
ではないことを認識してください。質問文を見る限り,その認識すらないように思えます。

送信側でNagleアルゴリズムを無効にしても,受信側では複数のパケットをまとめることがありえます。
また,普通のサーバー相手にNagleアルゴリズムを無効にして送ることは迷惑になるだけです。
さらに,Winsockの仕様としてもデフォルトで有効にすることになっています。


WinSockコントロールでは確かソケットオプションの設定はできなかったはず。
API呼び出せば問題なく動くと思います。

編集 削除
ひげ  2002-11-22 07:51:55  No: 76417  IP: [192.*.*.*]

データ境界について理解しました。
お手数おかけいたします。

正直いいますと、サーバに対してでなく、ルータを
相手にするものを作成しています。用途として
BGPでの経路配信を考えておりました。今回はもう少し
煮詰めなおす事と致します。

ご返答まことにありがとうございました。

編集 削除