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

解決


ひげ  2002-11-20 18:36:05  No: 76411

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 19:22:58  No: 76412

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


ひげ  2002-11-21 07:42:27  No: 76413

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


YuO  2002-11-21 08:39:32  No: 76414

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


ひげ  2002-11-22 06:47:42  No: 76415

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


YuO  2002-11-22 09:21:54  No: 76416

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

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

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

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


ひげ  2002-11-22 16:51:55  No: 76417

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加