質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.01%

  • C

    3077questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    2936questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    1495questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

複数のPCで情報(信号)を共有する方法

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 4
  • VIEW 479

nodact

score 23

この質問を見ていただきましてありがとうございます。
当方、C言語の基本がわかるレベルのものです。
調べてみたのですが、結果にたどりつかなかったので質問させていただきます。

早速掲題の件です。
やりたいこと
マスターのパソコンから信号(数値の情報)を複数のPCに送りたい。
具体的には、複数のPCで動いているメインソフトから
今回作成したいプログラムを呼び出し、マスターから送られている
指令値を読み取ってそれに従いメインのプログラムが動くというものです。
なので、マスター側の送受信プログラムとスレーブ側の送受信プログラムが必要なのかなと思います。
出す指令値はすべてのPCに対しては共通です。
できれば、設定が完了したかというマスターへのリターンは受信側から欲しいです。
このメインのソフトでは通信のやり取りができないので、外部のソフトを動かして
情報を取得したい。
また、もし可能であればマスターからリクエストがあった場合、情報を返すということもしたいので
双方向のやり取りができるようにしたいです。

ここで質問なのですが、
1.そもそもVisual studioでこのようなプログラムは作成可能でしょうか?
2.このようなプログラムを作成する場合、Visual studio以外のほうが向いているのでしょうか
3.これを作成するにあたり、おすすめの参考書はありますか
4.似たような事例はありますか?

以上になります。
説明不足などわかりにくい部分があったら申し訳ございません。
質問等は早めに返します。
ご協力の程よろしくお願いいたします。

イメージ説明
補足です。
上記の図のように、マスターからスレーブのPCへ送信して
スレーブ側は受け取った値をスレーブ側のプログラムに渡したいです。
可能であれば、設定を完了したというアンサーをマスター側へ返したいです。
送信項目は一例です。難しいことは送らないで、
簡単に送ろうと思っています。
もし可能であれば、個別に送信もしたいです。

イメージ説明
umyu様のご回答を踏まえて作成してみました。
正直、理解しきれていない箇所もありますが記載しています。
http~部分など。
まずは、仕組みを理解する必要もあるかもしれません。

追加2017.11.14
更新が遅くなってしまい申し訳ございません。
ルーターの設定の件などに関して先にご回答させていただきます。
ルーター等のネットワークなどの構成自体は変更は難しいということでした。
理由としては、
自社のルーターを超えて、行くわけですが操作したいスレーブ側のPCでは
一般的なPCの他に、レンタルサーバーを、利用してその中でメインのソフトを動かしているのものあるためです。

その他色々と方向性が見えた部分がありました。
後ほど、早ければ今晩にでも更新させていただきます。
何卒よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • showkit

    2017/11/02 15:47

    確認です。おそらく 質問に沿った形なら UDP/IP 通信を使うというのが いいかと思いますが、そういう回答でもよいですか? メールスロットを使うという方法もありますが、説明のみだと UDP/IP がよさそうな感じですので・・・。

    キャンセル

  • nodact

    2017/11/02 16:03 編集

    >showkit様 ご質問ありがとうございます。 UDP/IPというのを初めて知り、少し調べてみました。大変恐縮ではございますが、これをソフト側で読みたいとすると、どういったことをしたらよいのでしょうか?基本構造はたくさん検索で見つけたのですが、実使用方法がいまいちつかめなっかたものでして。。。あとは、勉強するとしたら、VB.NETというのを勉強するといいのでしょうか?

    キャンセル

  • tmp

    2017/11/07 12:32

    ルーター越えするなら、そのネットワーク構成やルーターの設定は変更可能なのかとか、詳しくかかないとせっかくの案が無駄になる恐れがありますよ

    キャンセル

回答 3

checkベストアンサー

+1

1,そもそもVisual studioでこのようなプログラムは作成可能でしょうか?

はい。可能です。

確認したいポイントが5点あります。
1,送りたいデータに関して
1-1,信号はロス(欠損)しても、大丈夫なデータなのでしょうか?
1-2,制御コードは送信データに含まれますか?
1-3,データ量と頻度はどれくらいの間隔ですか?
2,開発する期間はどれくらいを想定してますか?
3,送信側PCと受信側PCはルーターを超えますか?

◆案1,HTTPプロトコルを流用して、簡易webサーバーと独自仕様の通信プログラムを作成することです。(筆者お勧め)
理由:通信プログラムをテスト/デバックする必要があるのですが、
httpプロトコルベースだとブラウザの開発者ツールやフリーソフトがあるので、テストツールの作成負荷が軽減されます。

.netなら
System.Net.HttpListenerが使用できます。

◆案2,ネットワーク共有フォルダを各PCに作成して、ファイルコピー&ファイル受信監視ソフトを使って通信する。
問題点:開発は案1と比較して開発難易度が低いですが、ルータやFWに通信が制限される事が多い事と、共有フォルダのアクセス権限の問題が発生します。

開発するに当たっては、まず送信側PCと受信側PCの状態遷移図を記述しながら、通信プロトコルを設計したほうが手戻りが少ないと思います。


コメント欄への返信に追記です。

Webサーバーを作成して情報をあげて、そこから情報を取得するという感じでしょうか?

はい、簡易的なwebサーバーをSystem.Net.HttpListenerで作成です。
1,スレイブ側はマスターからの受信を送受信ソフトで受信待機。(listen)
2,マスターは信号を契機にスレイブ側にPOST/GET要求。

参考までに信号送信とスレイブ1側の情報要求の簡易的なイメージ図を添付します。
◆信号送信
メソッド:POST
URL:http://スレイブ1:送受信ソフトのポート番号/control
データ:信号(起動/終了、スタート/ストップ)、プロトコルバージョン※1
信号送信
※1
プロトコルバージョンはurlに含める形でも良いと思います。
◆情報要求
メソッド:GET
URL:http://スレイブ1:送受信ソフトのポート番号/information
データ:なし
情報要求

状態遷移図に含めたい物としては例えば
1,信号:起動が未送信状態の時に信号:スタート/ストップがスレイブ側に間違って送られた時にどう対応したいのか?
2,スレイブ側のPCが電源断/再起動などでスレーブ側のメインのプログラムがシャットダウンした時のリカバリー方法
があります。

マスターの送受信ソフトは最初はブラウザまたPowerShellで代用できるので開発優先順位としては低いです。


2017/11/06の追記2です
てっきり送受信ソフト<->スレイブ側のメインソフトのインターフェイス要件(起動/通信方法及びパラメータ)は決まっていると思ってました・・・。
まずはメインソフトの作成者の方またはメインソフトの仕様に詳しい人と話し合って
送受信ソフト<->スレイブ側のメインソフト間の大まかなインターフェイス要件を詰めたほうがいいのではないかと。

最低限確認しないといけないことは以下の6点でしょうか
1,送受信ソフトからメインソフトへの信号(起動、終了、スタート、ストップ)、状態問い合わせの送り方とメインソフト側での検知方法。
2,送受信ソフトからの信号をメインソフトで処理したという結果(信号の処理にもしも時間が掛かるなら、その場合はどうするのか)をメインソフトから送受信ソフトへどうやって返す予定なのか。
3,送受信ソフトからスレイブ側のメインソフトに信号を送ってはダメなタイミングは存在するのか?(例えばメインソフトで何らかの処理を処理継続中の時など)
→これがあると結構大変になります。。。
4,信号:起動を送った時のメインソフトを起動する時の起動パラメータ。(あれば)
5,疎通テスト環境の作り方。
6,パラメータのフォーマット。(フォーマットにはプロトコルバージョン(上図のとは別)があるのが理想ですが、ココらへんは作成者の好みによるかと。。)

これとは別にマスターのパソコンから信号を送るタイミングに付いても、関係者への周知事項として必要になる事が多いため予め決めておく必要があります。
(定期的/臨時)でこの時間/このタイミングでこの信号をスレイブに送るという情報

話題が逸れてしまったので戻します、以下は質問の回答です。
1.指定したソフトが起動しているか判別かのうか
スレイブ側の送受信ソフトで判断する事が可能です。
ゆるい判定…System.Diagnostics.Process.GetProcessesByName
厳密な判定…System.Threading.Mutex
→二重起動防止方法でぐぐると参考情報が出てくるかと。

2.スレーブの送受信ソフトから指定されたソフトを起動可能か
ProcessInfo#Start()でソフトの起動が行えます。
送受信ソフトとユーザーが同じになる点が注意点でしょうか。

3.マスター側からスレーブのソフトを起動することは可能か
こちらは上の2に関連しますが、スレイブ側PCのスタートアップに送受信ソフトを入れておけば、
スレイブのPCが再起動しログイン※1したタイミングでマスター側の信号送信を契機にスレイブ側のソフトを起動できます。
※1 これが嫌な時はWindowsサービスを作成する必要がありますが、難易度が高くなります。私も回答できる範囲を超えてるので、再度要件を纏めて、msdnフォーラムやstackoverflowで聞いてみるのもいいかもしれません。
※注意点として、マスター側から定期的に問い合わせ(ポーリング)をしないといけなくなりますが。
 
電源断/再起動に関してはシステム管理/運用部があればそちらの方で、検知してるのではないかと。


追記3
Visual studioのC#言語&WPFで作ったスレイブ側の送受信ソフトのサンプルソースへのGitHubリンクを貼っておきます。
あくまでもこんな感じというサンプルです本来必要なエラー処理が大量に抜けています、あまり流用しないでください。
Visual studioでサーバー側のデバック実行とブラウザの開発者ツールでネットワークログを見ながら、ダミークライアント(control_test.html、information_test.html)を使ってみてください。


2017/11/15追記4
ルータ側の設定を変更出来ない場合は、httpやhttps以外のポート番号だとファイアウォールでフィルタリングされる可能性がありますが。
通信ソフトの大前提として、スレイブ側は任意のポート番号で通信の受信待機をする必要があるという認識を持ってくださいな。
3分間ネットワークの第43回レイヤ4 ポート番号の説明

1./controlと/informationに関してなのですが、
この中にあるアドレスの「127.0.0.1:6556」の部分はどうやってきめているのでしょうか?

TCP/IPは1:1通信なため相手先のIPアドレスとポート番号が必ず必要です。
127.0.0.1:6556→まず127.0.0.1は自分自身を表すループバックアドレスです、そしてポート番号:6556です。
これは質問文だとスレイブ1~4のPCのIPアドレスになり、スレイブ側でサーバーが使っていないポート番号を質問者が決める必要があります。

2./controlで、信号という項目がございますが、これはどういった風に使うのでしょうか?

元々の質問として、スレイブ側に信号情報(スタート、ストップ、起動、終了)を送りたいという質問ではなかったのですかー?
スレイブ側に伝える情報として、信号情報が必要です。
そして、送信側(マスタ側の送信ソフト)が信号の取りうる値を定義(例えば、スタートは値:1,ストップは値2など)して、それをスレイブ側に伝える必要があります。
受信待機しているスレイブ側は送られてきた信号値を元に処理を行う必要があります。
今回提案したのはデータとして信号情報を送るという形です。

3.上記2の質問と重なりますが、/informationの中で、信号のように取得したい情報を分けることは可能なのでしょうか?

ちょっと質問の意図が読めなかったのですが、
◆情報取得(/information)の時
1,マスター側から任意の送信データを送る。
2,スレイブ側は送られてきた送信データを元に処理を分岐したい
という質問で宜しいでしょうか?

/informationはメソッドがGETなので、クエリストリングになります。
HTTPとPOSTとGET
フォームデータを送信する
control_test.htmlと同じように
<input type="radio" name="data" value="001" checked>などをformタグ内に定義してみてください。

 <input type="submit" value="送信">

入力フォームに入力した内容をサーバー(スレイブ側)に送信するボタンです、「<input type="submit" value="送信">」でキーワード検索してみてください。

4.この/conrolや/informationの部分は大きなくくりでなにか呼ばれ方などはあるのでしょうか?

キーワード「REST API」「RESTful API」「Web API」とかで検索してみてください。

一番最初の回答にも記載しましたが、要件と全体フローをはっきりと定義したほうがいいのではー。
どういう情報をどのタイミングで送信したいのか、どういう結果を受信したいのか。
マスターとスレイブはどういう状態がありえるのか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/05 02:02

    ご回答ありがとうございます。
    ご質問いただいた件に関しまして回答させていただきます。
    1-1,信号はロス(欠損)しても、大丈夫なデータなのでしょうか?
    →なるべくしないほうがいいです。
    しかし、処理的にはそこまで早くなくていいので、スレーブ側で
    何回か同じ信号が来たら確定という判定はできます。
    なので、多少は大丈夫です。

    1-2,制御コードは送信データに含まれますか?
    →現状は含まない予定です。
    いくつか処理はしたいのですが、スレーブ側で受信した数値で
    モードを判別してスレーブ側で制御をおこなおうと考えています。

    1-3,データ量と頻度はどれくらいの間隔ですか?
    →頻度はまだ不確定です。
    理由ですが、1回マスターから信号をだしてスレーブ側に完璧な情報が
    のこり続けるのなら頻度は少ないのですが、
    ロスなどの可能性があるのであれば、定期的に送り続けて
    スレーブ側で情報が変わったら認識という形になります。
    その場合間隔は、早いに越したことはないですが、
    最低でも10秒以内くらいがいいです。

    2,開発する期間はどれくらいを想定してますか?
    →規模が想定できないので、とにかく早く開発はしたいです。
    イメージとしては1週間でした。
    しかし、可能であれば柔軟性を持たせたり、大規模なつくり直しは避けたいです。
    そのためには超えても仕方ないと認識しております。

    3,送信側PCと受信側PCはルーターを超えますか?
    →超えます。

    案1に関して質問なのですが、
    私の勉強不足で大変申し訳ございませんが、いまいちイメージが
    はっきりとわきませんでした。
    Webサーバーを作成して情報をあげて、そこから情報を取得するという感じでしょうか?

    私が考えてる簡単なイメージ図を添付します。
    ご意見いただけますと幸いです。
    何卒よろしくお願いいたします。

    キャンセル

  • 2017/11/06 09:56

    ご回答いただきましてありがとうございます。
    まず先に次についてコメントさせていただきます。
    1,信号:起動が未送信状態の時に信号:スタート/ストップがスレイブ側に間違って送られた時にどう対応したいのか?
    →これは、スレーブ側がのメインソフトが起動していない場合なので、スレーブ側の送受信ソフトでモード異常と判別を行いマスターへ回答を送りたいと考えておりました。
    指定されたソフトが起動しているかどうかという点は、Visual Studioで判別可能でしょうか?

    2,スレイブ側のPCが電源断/再起動などでスレーブ側のメインのプログラムがシャットダウンした時のリカバリー方法
    →盲点でした。
    メインプログラムの起動方法をすっかり忘れてました。すいません。
    現状ですと、メインプログラムは安全性を考慮し手動復帰としています。しかし、今回は起動コマンドが送られたら自動で起動しなければなりませんでした。また、そもそもですが、送受信ソフトもたちあげなければならないかもしれないです。
    そこで、自動で立ち上げれるものも必要になるかと思います。
    下記はVisualStudioで可能でしょうか?
    1.送受信ソフトからメインソフトを立ち上げる
    2.マスターからスレーブの送受信ソフトを起動する(want)

    また、スレーブのPCがシャットダウンしている場合ですと、マスターが送信しても信号が一定時間以内に返ってこない状況になると思いますので、マスター側で、タイムアウトエラーとして検知したいと考えています。
    これらが可能という前提ですリカバリーを考えたとき、マスターがスレーブに異常なしと思いコマンドを送って、返答がない又は異常状態が返ってきた場合には、マスター側で起動させるシーケンスに移行したいです。その後通常シーケンスという感じが理想です。
    長くなってしましました。

    まとめると、
    1.指定したソフトが起動しているか判別かのうか
    2.スレーブの送受信ソフトから指定されたソフトを起動可能か
    3.マスター側からスレーブのソフトを起動することは可能か
    と上記のことはVisual Studioで可能でしょうか?
    勉強不足で申し訳ございません。
    何卒よろしくお願いいたします。

    キャンセル

  • 2017/11/15 00:00

    ご回答いただきましてありがとうございます。
    お返事が遅れてしまい申し訳ございません。
    サンプルソースありがとうございます。
    こちらで、大変勉強させていただいております。
    私の勉強不足で申し訳ございませんが、何点かお聞きしたいことがございます。
    1./controlと/informationに関してなのですが、
    この中にあるアドレスの「127.0.0.1:6556」の部分はどうやってきめているのでしょうか?

    2./controlで、信号という項目がございますが、これはどういった風に使うのでしょうか?
    ご回答いただいていた図式の説明でも「date:信号」というご回答があったので
    その部分にあたるのかと思いますが、使用方法がわかりません。

    3.上記2の質問と重なりますが、/informationの中で、信号のように取得したい情報を分けることは可能なのでしょうか?
    また、「 <input type="submit" value="送信">」はどのような役割をしているのでしょうか?

    4.この/conrolや/informationの部分は大きなくくりでなにか呼ばれ方などはあるのでしょうか?
    私の勉強不足で申し訳ございません。http~の知識が少なく
    こういった書き方を初めて見ました。
    勉強したいのですが、なんと調べればよいのかと思いまして。

    お手数をおかけいたしますが何卒よろしくお願いいたします。

    キャンセル

  • 2017/11/15 18:21 編集

    ご回答いただきましてありがとうございます。
    取り急ぎ1点ご質問させていただきます。
    2./controlで、信号という項目がございますが、これはどういった風に使うのでしょうか?
    に関してなのですが、私の説明不足で申し訳ございません。
    http://IP~:ポート番号/control/
    の末尾に信号情報を記載して使用するのでしょうか?
    それとも別の方法でしょうか?
    また、いただいたソースで勉強していたのですが、
    Visual Studioでいただいたプログラムをデバックして
    ブラウザに(Firefox)で/informationや/controlで定義されている
    直接http~/controlを入力していたのですが、あっているのでしょうか?
    もしかして、この確認の仕方が間違っているのかなと思いまして。。。
    勉強不足ですいません。何卒よろしくお願いいたします。

    キャンセル

  • 2017/11/15 18:55

    1,ソリューションファイルを起動してServer.csの78行目にブレイクポイントを設置(左側の数字の灰色部分をクリック)してデバック実行。
    2,control_test.htmlをブラウザで開いてください。
    3,送信ボタンを押下。

    キャンセル

  • 2017/11/15 19:21

    ブラウザで送っているHTTPリクエストを確認を行いたい時は、firefoxなら、開発者ツール(ctrl+shift+I)でネットワークタブ→グリッドのPOSTをクリックして、ヘッダーやパラメータを確認してみてくださいな。

    キャンセル

  • 2017/11/16 08:27

    ツールを入れられる環境でしたら、Insomnia REST Clientがリクエスト/レスポンスが分かりやすいのでお勧めです。

    キャンセル

+1

Websocketなどのライブラリを使うのが一番手っ取り早く実装できると思います。

cだとメモリ管理が煩雑になるので、c++で実装したほうが実装コストは下がると思います。

業務でよく使うのはSocket.ioです。

https://github.com/socketio/socket.io-client-cpp

もちろんC言語の基本が分かる程度というお話なので無理にとは言いませんが、知識としてあるといいかと思います。

通信系の実装をSocketなどで手で実装してみるのも勉強になるので色々試してみるといいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/15 00:09

    ご回答いただいましてありがとうございます。
    お返事が遅れてしまい申し訳ございません。
    サンプルも載せていただきありがとうございます。

    Websocketを調べていたのですが、
    こちらは双方向の通信が可能なことは分かったのですが、
    1 対 多 といったような通信も可能なのでしょうか?

    また、少し元の観点とはずれてしまいますが、C#でもこれは可能なのでしょうか?
    会社の意向としまして、C#を少しずつ取り入れていきたいらしく。。。

    申し訳ございませんが、ご教示の程お願い申し上げます。
    何卒よろしくお願いいたします。

    キャンセル

  • 2017/11/17 12:29

    Websocketは通信のプロトコルであり、1対多の通信を実現するには自前で実装するしかありません。

    Socket.ioであれば、Websocketよりも上位の階層に位置しているのでそういった機能も提供されております。
    ただC#に関しては、あまり良いライブラリ(Socket.ioクライアント)が存在していないため、最新の仕様に安定して対応しているものは現状ありません。
    少し古いversionでは対応している物もありますが。

    Websocketに関しては一昔前から存在しているため、ほとんどの言語でクライアント実装は存在しています。

    C言語で通信を実装するのであればlinux系の通信を利用するのが楽です。C++11(C++14)だと、そちらをラッピングしているので、さらに楽です。(特に通信で必要になってくる非同期処理とかも楽)
    そしてC++11を基盤にSocket.ioのC++クライアントは実装されているのでイベント管理やルーム(接続区分)を利用してのブロードキャスト(1対多)などが非常に楽になります。

    C#になってくると.Net Frameworkのソケット関連を利用するのがよいでしょう。
    .Net Frameworkであればブロードキャスト(1対多)にも対応しています。

    ただ.Netのソケット周りは非同期処理や例外処理をある程度理解していないといけないので実装コストは高めです。

    実現したいことや、開発環境などによっても選定すべき技術は変わってくるので一概に何が正解かは言えませんが、参考になれば幸いです。
    (WebsocketはWeb技術なので、Webサーバ系とのやりとりに利がある。.NetはMS基盤なのでAzureやMFCなどMS系の業務ソフト開発では利がある。)

    キャンセル

0

C言語が わかる、Visual Studio が使えるという前提で・・・
UDP/IP 通信を利用して、ブロードキャストアドレスへの送信というものを行えば、1台のマシンから複数のマシンへ送信を行えます。

ブロードキャストアドレスと言うキーワードと
例題の関数を 調べると
おぼろげながらも わかってくるのではないかと思います。

実績のあるプログラムのうち基本的な部分だけ抜き書きしておきます。
抜き書きなので このまま 書いても コンパイルは通りませんので悪しからず。

//  初期化

    WSADATA wsaData;
    ret = WSAStartup(MAKEWORD(2,0), &wsaData);

    if(0 != ret)
    {
        //  エラー処理
    }

    // ソケットの作成

    socket_ = ::socket(AF_INET, SOCK_DGRAM, 0);

    if (socket_ == INVALID_SOCKET)                                                    
    {
        //  エラー処理
    }


//  送信側

    struct        sockaddr_in addr_ =  {};                        

    addr_.sin_family = AF_INET;
    addr_.sin_port = htons(port);
    addr_.sin_addr.S_un.S_addr = inet_addr(ipAddress);                // ブロードキャストアドレスに送信


    length = sendto(socket_, 送信用バッファ, sizeof(送信バイト数), 0, (struct sockaddr *)&addr_, sizeof(addr_));

    if(0 == length)
    {
        //  エラー処理
    }


//  受信側

    sockaddr_in        localaddr ={};

    localaddr.sin_family = AF_INET;
    localaddr.sin_port = htons(port);
    localaddr.sin_addr.S_un.S_addr = INADDR_ANY;

    // バインド        
    int status = ::bind(socket_, (sockaddr*)&localaddr, sizeof(sockaddr_in));
    if (status == SOCKET_ERROR)
    {
        //  エラー処理
    }

    int size = sizeof(sockaddr_in);

    int length = ::recvfrom(socket, 受信用バッファ, 受信最大バイト, 0, (sockaddr*) &localaddr, &size);

    if (length == SOCKET_ERROR)
    {
        //  エラー処理
    }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/02 17:09

    ご回答ありがとうございます。
    例も記載いただいて非常に勉強になります。
    ご教示いただいたワードと関数を調べていたところ、
    TCP/IPのものがたくさん出て来ました。これは同じようなものなのでしょうか?
    勉強する上では、TCP/IPの参考書等を購入しても勉強できますか?

    キャンセル

  • 2017/11/02 17:18

    TCP/IP と UDP/IP は 同じ Ehernet を使用するものですが。コネクションの方法が異なります。
    TCP/IP に比べて UDP/IP の接続は 緩いので、一つのマシンから 多数のマシンへ ブロードキャスト で送信ができます。
    TCP/IP であると それぞれのマシンと接続を確実に行う必要があるので、今、調べていることを解決するには いささか難しくなるように思います。
    TCP/IP に比べると UDP/IP の参考書は 少ないかと思います。
    TCP/IP の参考書でも UDP/IP について 言及しているのではないかかと思います。

    キャンセル

  • 2017/11/02 17:30

    追伸
    他の方が 全然別の アプローチを 考えてくれるかもしれません。
    もし別のアプローチがなかなか出てこなければ、一度、勉強して、また、わからなくなったらここで質問してはいかがでしょうか。

    キャンセル

  • 2017/11/02 17:32

    ご回答ありがとうございます。
    では、参考書を揃えるより
    、既存のものを読み解いた方が良さそうですね。
    例題のはC++のようですが、C++の知識はどの程度必要でしょうか?

    キャンセル

  • 2017/11/02 17:37

    C++ である必要はまったくありません。C言語でじゅうぶんです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3077questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    2936questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    1495questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。