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

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

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

Re[2]: ソケット通信の方法


(過去ログ 109 を表示中)

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

■64857 / inTopicNo.1)  ソケット通信の方法
  
□投稿者/ ヤマダ (1回)-(2013/01/18(Fri) 01:17:51)

分類:[.NET 全般] 

○開発内容につきまして
 室内に設置された温度計の温度を取得し、それをデータベースに登録後
 クライアントサーバに送信します。
 クライアントサーバはその温度データを画面に表示するといった内容です。
○したいこと
 温度計は全部で10箇所設置しており、
 サーバ側から接続処理をおこない3秒単位で温度データをとります。ここは非同期で通信したいとおもってます。
 その後クライアントサーバにデータを遅延なく送付する必要があります。ですので、あらかじめクライアントサーバと接続し常時コネクションをたもっていたいとおもっています。
 以下が構成です。
「温度計」----常時接続ソケット----「処理サーバ」-----常時接続ソケット---「クライアントサーバ」
「温度計」----常時接続ソケット---|
「温度計」----常時接続ソケット---|

 非同期で受信したデータを別スレッドで常時接続しているクライアントサーバにデータを逐一送ることは可能でしょうか。

 また上記構成でソケットを使った場合、上記の接続方式はまちがっているでしょうか。クライアントサーバ側で複数の待ち受けポートを用意するほうがよいのでしょうか。
 一番良い方法またコーディング方法をご教授いただければ幸いです。

説明が下手で大変申し訳ありませんが有識者のかた何卒よろしくお願いいたします。
引用返信 編集キー/
■64868 / inTopicNo.2)  Re[1]: ソケット通信の方法
□投稿者/ 甕星 (7回)-(2013/01/18(Fri) 22:44:11)
間違ってはいませんが、大事な事が考察から抜けているように思います。
まず「遅延なく送付する」と言うのは技術者としては酷くあいまいな表現です。遅延がゼロと言う事はあり得ません。ここで問題とするべきなのは、何処までの遅延なら許容できるのか?と言う事です。また正常時は当然として、エラーが発生した時にどうするのかも考えなくてはなりません。

TCPによる接続を選択していますが、これは比較的遅延が大きい方法です。
TCPはNagleアルゴリズムにより送信データ量を抑えようとします。デフォルトだと、およそ200msほど継続するデータが無いか待ってから、実際にネットワークにデータを流します。これはSocketのオプションでNODELAYを指定すれば無効にできます。
TCPでは送信タイムアウトエラーが発生するまでに約3分かかります。エラーが発生した場合、それを検出して再送を試みるまで、最短で3分かかるわけです。この設定はOS全体に影響を与える為、気軽に短くするわけにもいきません。

一般的に遅延が問題となる場合はUDPを選択します。

処理サーバーが何のために有るのかも疑問です。通信に介在する端末が増えれば、その分遅延が大きくなるからです。処理サーバーが無くなれば、それだけで遅延が半分になるはずです。
引用返信 編集キー/
■64873 / inTopicNo.3)  Re[2]: ソケット通信の方法
□投稿者/ オショウ (59回)-(2013/01/19(Sat) 11:37:01)
FAのソフト屋やってますが・・・(長文になりました。すいません)

外付けの温度計10〜20台と以外のセンサーも10〜20台接続して、環境計測装置を
作ったことあります。10秒毎で全センサーデータをシリアル通信して、ソケット通信で
(無線LANです)サーバーに送信してますが・・・何年も稼働させていて、通信異常に
なったケースは、トラック等の違法無線で無線LANのセッションが切れた場合のみ。

確かに、いろいろセッションの接続確認やソフトウェア的細工もしてますが、気にする程
度ではありません。気にする点があるとすれば、ネットワークに使用する機材の性能の問
題です。安物スイッチハブを使えば、すぐに熱劣化して遅延が甚だしい・・・

それとTCPよりUDPと言うのもおかしい。
メリット・デメリットはあります。何を要求するかで、確かに判断は分かれますが。
UDPの場合、パケットロストの可能性があるので、絶えず応答パケットを入れないと送
信側が解らない。このオーバーヘッドの方の時間的損失の方が、大きくなる場合があるの
で、要注意です。

それとデフォルトのタイムアウト時間は、90秒強ではなかったでしょうか?
(それは古いOSの話?)タイムアウト時間はオプションで設定できますので、行う必要
はあります。

また、送信時にpingを行い、相手の生存確認やネットワーク接続が生きていることも確認
する必要はあると思います。pingで遅延時間を計測しておけば、長くなれば『何かあった』
と判断できますので。

3秒毎のデータハンドリングと言うことですが、センサーからのデータ取得側にサーバー
へ送信できなかった場合のバッファリング機能を入れておく必要はあると思います。
次回、正常通信再開時に未送信データがあった場合、後からでも送信しておけば欠損デー
タにはならないので。

FA系の機器でも、送信異常となった場合、バッファリングして接続再開時に送信しなお
すと言う機能は大抵導入されてます。トレーサビリティーの重要性が高まってますので、
未送信データをロストさせることだけは、極力回避させてます。

※ 最後になってしまいましたが・・・
  温度計とのソケット通信ですが、処理PC側からコマンド送信して、応答を受信する
  までの時間はどの程度ありますか?その時間によって、10個のスレッドで各々非同
  期通信ソケットで行うのか、1個のスレッドで10台分のデータ受信を行うのか。
  また、温度計側が安定して応答するのか否か。

  上記の環境計測した折、各センサーとの通信で、予め通信時間を測定しておき、バラ
  ツキの大きいものや、応答時間が長いものは使わないようにしました。
  センサーに個体差があるので、すべて同じ・・・と言うようにはいきません。

※ 処理PCとサーバー間の通信時間も計測して、3秒のタクトに対し、余裕がないと、
  結果、コケテしまいますヨ!

  処理PC側は、10台のセンサーとの通信最大時間は、2秒がMAXでしょう。
  処理PCとサーバー間も、次の3秒(次のデータ送信までの間)のうち、限界2秒程
  度でしょう。

  タイムアウトとしては、10台分の温度データが1台目の通信開始から10台目まで
  の間が2秒MAXとして考えますと、1秒でしょう。(全体でです)
  個別の温度センサーとの通信タイムアウトを考慮するのかどうかは、シングルスレッ
  ドで行うのか、マルチスレッドで行うのかで変化します。

※ 簡単そうで、結構難しいんです。
  機器との通信がヘタなソケット通信よりシリアル通信の方が早くて安定している傾向
  にあります。
  ネットワーク・シリアル変換アダプタを使って、PC側には仮想シリアルポートドラ
  イバーを入れて、センサーのデータ収集を行ったこともあります。シリアル通信のタ
  イムアウト処理の方が、ソケット通信より楽なんで・・・

以上。参考まで
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -