C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: ソケット通信の受信間隔時間を一定にしたい


(過去ログ 91 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■54364 / inTopicNo.1)  ソケット通信の受信間隔時間を一定にしたい
  
□投稿者/ ホエホエ (21回)-(2010/10/15(Fri) 09:51:38)

分類:[ネットワーク全般] 

下記にてソケット通信に関して質問させていただいておりました。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=53983
http://bbs.wankuma.com/index.cgi?mode=al2&namber=54331

最初にMFC CSocketクラスを用いてたのをwinsockに変えたり、
非同期処理だったのをマルチスレッドにして同期処理にしましたが
解決しなかったので質問させていただきました。

動作の概要としては送信側は1500バイトのデータを10ミリ秒に
1度送信し、受信側はデータを受信するごとに動作すると言う
流れなのですが…

送信側と受信側でそれぞれ送信・受信間隔時間を計測すると、
送信側は10ミリ秒に1度1500バイトを送信しているのに対して
受信側は不定期に受信が発生し約4000バイトぐらいまとめて
受信してしまいます。

これをどうにか受信側も10+1〜2ミリ秒程度に確実に受信したいと
思うのですが良い方法はないでしょうか?

検索で調べるとMTU/RWINと言う設定が関わってるようなんですが、
1度の受信バイト数は少なくても良いので受信割込(メッセージ)の
間隔を狭めれたら良いのですが…

ご存知の方教えてください。
引用返信 編集キー/
■54365 / inTopicNo.2)  Re[1]: ソケット通信の受信間隔時間を一定にしたい
□投稿者/ 774RR (545回)-(2010/10/15(Fri) 10:20:33)
> 受信側は不定期に受信が発生し約4000バイトぐらいまとめて
それは TCP というプロトコルを使っている限りにおいて仕様どおり。
(Nagel アルゴリズムという)
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/intermediate.html#disable-nagle

# UDP にするとか・・・

> 検索で調べるとMTU/RWINと言う設定が関わってるようなんですが、
その変更は当該 Ethernet ポートを経由するすべての通信に影響する
= Web のブラウズや各種ファイルのダウンロードなどの速度すべてが低下する
ので、安易な変更は推奨できない。

特定目的専用機で、そのソフト以外は絶対に使用しないとかいうなら別だけど。
引用返信 編集キー/
■54367 / inTopicNo.3)  Re[2]: ソケット通信の受信間隔時間を一定にしたい
□投稿者/ PATIO (27回)-(2010/10/15(Fri) 12:11:21)
そもそもというか、TCP/IPを使ってLAN上で動かす時に
いわれているような精度が期待できるものなんですかねぇ。
それともクロスケーブルで直結でもするのかなぁ。

シリアルポートみたいに直結で他の干渉も一切ない状況ならとも思いますけれど。

引用返信 編集キー/
■54380 / inTopicNo.4)  Re[1]: ソケット通信の受信間隔時間を一定にしたい
□投稿者/ れい (967回)-(2010/10/16(Sat) 07:28:12)
No54364 (ホエホエ さん) に返信
> これをどうにか受信側も10+1〜2ミリ秒程度に確実に受信したいと
> 思うのですが良い方法はないでしょうか?

ありません。
TCPで通信するのであれば時間を指定して確実に受信する方法はありません。

TCPに帯域保証はありませんし、普通のwindowsはリアルタイムOSではありませんので、
10msecオーダーの正確性は出ません。
Socketスタックだけでその誤差が発生し得ます。

UDPを使えばnagleの制約はなくなりますが、同様に10msecの精度はでません。

> 最初にMFC CSocketクラスを用いてたのをwinsockに変えたり、
> 非同期処理だったのをマルチスレッドにして同期処理にしましたが
> 解決しなかったので質問させていただきました。

どの技術のどこがボトルネックなのかを最初に調べないと大変です。
WindowsとTCPを使う限り、10+-2msecの精度は不可能です。
例えば、帯域保証のある別のプロトコルを使ってRealTimeOSで処理をする、といった設計にしないといけません。

引用返信 編集キー/
■54410 / inTopicNo.5)  Re[2]: ソケット通信の受信間隔時間を一定にしたい
□投稿者/ ホエホエ (23回)-(2010/10/19(Tue) 10:29:36)
れいさん>
別記事投稿も含めご返信ありがとうございます。

通信速度と接続数(1台のPCに6台)の関係でLANを使用したくて、
TCP or UDPと言う選択になりました。

10ミリ秒に確実に受信したい!と言うよりは、送信元が10ミリ秒間隔で
送信してくるデータをなるべく遅れなく(2〜3ミリ秒遅延は許容範囲)受信し
処理したいと言うのが主目的なんですが、やはりUDPでも難しいのでしょうか?
引用返信 編集キー/
■54411 / inTopicNo.6)  Re[3]: ソケット通信の受信間隔時間を一定にしたい
□投稿者/ 774RR (546回)-(2010/10/19(Tue) 10:46:14)
前提条件がまったく見えないので、何をどうアドバイスしてよいやら?

その機器は
・何台あるのか。
・どういう物理・論理トポロジーが必要なのか。
仮に Ethernet で接続するとして
・ごく近くにある(=有線で同一HUBに接続されているレベル)のか。
・WAN ごしに VPN 接続等がありうるのか。
遅延 2msec ってのはどこからきた数値なのか。
データ欠損があってよいのか。
遅延と欠損とどっちが許されてどっちが許されないのか。

Ethernet というか IP ネットワークであれば、途中に入りうる中継機器の遅延を考察する必要がある。
UDP だとデータ欠損や前後入れ替えがありうるので、そういう前提で処理を組む必要があるし
そもそも欠損があってはならないのであれば使えない。

遅延時間を事前に見積もる必要があって欠損がダメなら、根本的にハードウェア側での対処が必要であり、
例えば USB で Interrupt 通信とか、帯域保証・遅延保証のある方式をつかわなきゃならない。

引用返信 編集キー/
■54421 / inTopicNo.7)  Re[3]: ソケット通信の受信間隔時間を一定にしたい
□投稿者/ shu (114回)-(2010/10/19(Tue) 13:14:52)
No54410 (ホエホエ さん) に返信

送信側の10ms間隔というのに特にこだわらないのなら
受信完了またはソケットが切られるまで送信しないとかすれば
いいのではないかな?
引用返信 編集キー/
■54496 / inTopicNo.8)  Re[4]: ソケット通信の受信間隔時間を一定にしたい
□投稿者/ ホエホエ (24回)-(2010/10/22(Fri) 11:56:57)
774RRさん>
ご返信ありがとうございます。説明不足ですみません(涙

前提条件としては
・LAN接続通信相手は従属用PCが最大6台、非PC装置が1台を
 1台の制御用PCに接続。

・現在は最低条件として従属用パソコン1台と非PC装置1台を
 制御用PCに全て有線LANでスイッチングHUB経由にて接続。

・WAN接続はなくHUB経由に問題があれば制御用PCにLANコネクタを
 増設する方法も検討。

処理の流れとしては
1.従属用PCが10ミリ秒間隔で発生するデータに対して処理をし
  1500バイト長のデータ作成して制御用PCにソケット通信で送信。
  送信データ作成に現在掛かっている時間が2ミリ秒。

2.制御用PCは従属用PCのデータを元に非PC装置にソケット通信で
  1000バイト長のデータを送信。

3.非PC装置は制御用PCのデータを元に機械を作動させる。
となっております。

1〜3までの許容できる時間は最大133ミリ秒までなので、
従属用PCが送る10ミリ秒の送信データをなるべくまとめて一気でなく
処理できればと思ってます。

データ欠損や入れ替えをソフト側で対処するのは厳しく
それを考えると多少はまとめて受信するのも問題ないので
結局はTCPのままで受信間隔時間を上げる方法を
考えた方が良いのかもしれませんね。

shuさん>
ご返信ありがとうございます。

送信側の10ミリ秒間隔で送ってくるのを、数データ分まとめて受信して
処理するのは良いのですが、もう少し受信間隔を上げれた方が良いのですが…
引用返信 編集キー/
■54503 / inTopicNo.9)  Re[5]: ソケット通信の受信間隔時間を一定にしたい
□投稿者/ shu (118回)-(2010/10/22(Fri) 13:34:31)
No54496 (ホエホエ さん) に返信

> 処理の流れとしては
> 1.従属用PCが10ミリ秒間隔で発生するデータに対して処理をし
>   1500バイト長のデータ作成して制御用PCにソケット通信で送信。
>   送信データ作成に現在掛かっている時間が2ミリ秒。
データ発生制御または遅延データ破棄が出来ないとするとデータ発生毎にスレッドを起こし
ソケット接続をする必要がありそう。データ順番が入れ替わる可能性が出てしまいますが・・・
引用返信 編集キー/
■54524 / inTopicNo.10)  Re[5]: ソケット通信の受信間隔時間を一定にしたい
□投稿者/ れい (969回)-(2010/10/24(Sun) 05:36:06)
No54496 (ホエホエ さん) に返信
> データ欠損や入れ替えをソフト側で対処するのは厳しく
> それを考えると多少はまとめて受信するのも問題ないので
> 結局はTCPのままで受信間隔時間を上げる方法を
> 考えた方が良いのかもしれませんね。

遅延もだめ、エラーもダメというなら、もう手はありません。
仕様を考え直した方がいいと思いますよ。

まず、OSのタスク割り当て時間に保証がありません。
平均2msecで処理できていたとしても、他に思い処理があればパケットを処理する間に133msec経ってしまう可能性があります。
まず、これがクリアできません。

他のプロセスを殺したり、速いPCを使ったりしてこれをクリアしたとしても、
ネットワークの信頼性の問題があります。

送信データは10msec毎に1500byteが6つと1000byteが一つです。
Ethernetのビットエラーレート(BER)を10^-9としたら

(1500x6+1000)x8 bit / 10 msec x 10^-9 = 0.008bit/sec -> 125sec

およそ125secに1回エラーが起きます。

通信にUDPを使うなら、エラーが起きた場合ほとんどがEtherのエラーチェックで廃棄されますので、
125secに1回パケ落ちして情報が届きません。

通信にTCPを使うなら、125secに1回再送されることになります。
それにはほぼ間違いなく133msec以上の時間がかかるでしょう。

実際にはBERはもう少し良いはずですが、最悪の場合は平均2分しか動かないプログラムになります。
よいNIC、よいHUB、よいケーブルを使って、あと2ケタBERを上げても4時間に1回はエラーになります。
3ケタあげても2日に1回エラーです。

その仕様ではちゃんとしたものは作れないと思いますよ。
引用返信 編集キー/
■54526 / inTopicNo.11)  Re[6]: ソケット通信の受信間隔時間を一定にしたい
□投稿者/ オショウ (555回)-(2010/10/24(Sun) 18:58:14)
> 動作の概要としては送信側は1500バイトのデータを10ミリ秒に
> 1度送信し、受信側はデータを受信するごとに動作すると言う
> 流れなのですが…

  と言う仕様なら、Windowsでのアプリケーションでは無理です。
  デバドラ書ける人なら、その理由は解っています。
  なんせOSの仕様なんで・・・

  http://support.microsoft.com/kb/259025/ja
  http://www.atmarkit.co.jp/fwin2k/special/win9xorwin2k/win2kprocess_5.html

  100〜120m秒なら、可能かもしれません。

  どうにかしたい!と言うのであれば、アプリを諦めてドライバー側で行う
  ソフトウェアにする必要があるかと。フィルタードライバー書けば応答は
  可能かと思いますが、embededOSにする必要があるように思います。

  あと、LANポートですが、PCIバスに刺したものか
  マザボード上のものかで、レスポンスは変化します。

※ 0.2m秒で数十バイトレベルならば、連続稼働1000時間を達成させた実績
  はありますが、すべてデバイスドライバーを自作して行いました。
  LANボードも限定で、機器とPC側はクロスケーブルで直結です。
  あしからず。

※ Windowsをやめて、Linuxとか・・・

以上。
引用返信 編集キー/
■54527 / inTopicNo.12)  Re[7]: ソケット通信の受信間隔時間を一定にしたい
□投稿者/ オショウ (556回)-(2010/10/24(Sun) 19:04:36)
追伸・・・

INtime 使えば?
http://www.mnc.co.jp/intime/

可能かも。
使ったことはないですが、リアルタイムTCP/IPドライバが
提供されているんで・・・

以上。参考まで
引用返信 編集キー/
■54646 / inTopicNo.13)  Re[8]: ソケット通信の受信間隔時間を一定にしたい
□投稿者/ ホエホエ (25回)-(2010/10/28(Thu) 13:09:02)
みなさん、返信が遅れてしまい申し訳ありませんでした。

shuさん>
一応、受信側は送信元1つにつき1つのスレッドで処理しており
最大で送信元6台+送信先1台の7スレッドで動かす予定です。


れいさん>
ハード(システム)仕様は受注元が決めたので私の方で仕様変更は
ちょっと難しい立場でして…

何とか制御PCをCore i7マシン、接続PCは1台のみ、送信間隔を
33ミリ秒と言う要求最低限条件上では動いているのでどんどん条件を
厳しくする場合は仕様の変更提案をしたいと思います。

今回のケースにあったパソコン間通信(または共有メモリ装置?)って
何かありますか?


オショウさん>
ご返信ありがとうございます。

なるほど、0.2ミリ秒で数十バイトなら10ミリ秒間隔であれば
数百〜千数百バイトぐらいなら安定して送れそうですね。

LANポートは1つはマザーボード上のものですが、
追加でポートを増やす場合はUSBかPCIバスでHUBは経由せず
クロスケーブル直結と考えていただいて大丈夫です。

INtimeの方も良く検討して受注元に提案したいと思います。
引用返信 編集キー/
■54658 / inTopicNo.14)  Re[9]: ソケット通信の受信間隔時間を一定にしたい
□投稿者/ オショウ (557回)-(2010/10/28(Thu) 18:21:32)
> なるほど、0.2ミリ秒で数十バイトなら10ミリ秒間隔であれば
> 数百〜千数百バイトぐらいなら安定して送れそうですね。

  あくまでデバドラを作っての話です。
  一般アプリではありません。

> LANポートは1つはマザーボード上のものですが、
> 追加でポートを増やす場合はUSBかPCIバスでHUBは経由せず
> クロスケーブル直結と考えていただいて大丈夫です。

  USB変換はやめて下さい。性能出ません。
  複数のバス接続でのネットワーク通信は、バス切り替えの
  為のチップセットの性能がレスポンスを決めますので、こ
  れも注意が必要です。

  特にネットワークボードはバスマスタ形式なので、なかな
  かに難しい場合が出ます。

  複数のネットワークボードを使う場合は、メーカーや型式
  的に、同一のものを使う方がよい場合と、異種にした方が
  よい場合とに分かれます。

  要はボードのドライバーの性能に依存しますので、ケンカ
  したりする場合もありますので・・・

  サーバーに使うような複数ポートを持ったLANカードを
  使った方がよいかもしれません。

以上。あくまで参考です
引用返信 編集キー/
■54681 / inTopicNo.15)  Re[9]: ソケット通信の受信間隔時間を一定にしたい
□投稿者/ shu (129回)-(2010/10/29(Fri) 08:31:34)
No54646 (ホエホエ さん) に返信

>
> shuさん>
> 一応、受信側は送信元1つにつき1つのスレッドで処理しており
> 最大で送信元6台+送信先1台の7スレッドで動かす予定です。
1スレッドだと遅延の許容があっても10msで次のデータが発生してしまうのだから
遅延なく1サイクルを終了しないといけません。たとえば1サイクル50msかかるなら
最低でも5スレッドはないと遅延の吸収が出来ません。(スレッドを増やすことによる処理速度
低下は無視した場合ですが)
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -