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目的ではありません。検証用です。)
データ境界が維持されない,ということですか?
ストリームはそういうものです。データグラムを使ってください。
TCPで通信するうえは避けられない?
という事でしょうか?やはりUNIXかCじゃないと
だめなのかな、、、、
UNIXだろうがWinSockを直に(C等で)扱おうが,TCPである以上一緒です。
TCPというものがどのようなものか,勉強し直してみるとよいでしょう。
実際、VCで実現している(Snifferで見ると数ミリ秒の誤差で)アプリが
ありますが、なんらか策がある?のでしょうか?
一応,あることはあるのですが……。
#Nagleアルゴリズム(RFC 896)を無効化するオプション。
まずは,データ境界が維持されないことは,
> 奇怪な現象
ではないことを認識してください。質問文を見る限り,その認識すらないように思えます。
送信側でNagleアルゴリズムを無効にしても,受信側では複数のパケットをまとめることがありえます。
また,普通のサーバー相手にNagleアルゴリズムを無効にして送ることは迷惑になるだけです。
さらに,Winsockの仕様としてもデフォルトで有効にすることになっています。
WinSockコントロールでは確かソケットオプションの設定はできなかったはず。
API呼び出せば問題なく動くと思います。
データ境界について理解しました。
お手数おかけいたします。
正直いいますと、サーバに対してでなく、ルータを
相手にするものを作成しています。用途として
BGPでの経路配信を考えておりました。今回はもう少し
煮詰めなおす事と致します。
ご返答まことにありがとうございました。
ツイート | ![]() |