シーケンス制御装置とデータや命令のやりとりをEthernet経由でやりたいですけれども、
C++で実現したい場合、WindowsとLINUX 両方ともコンパイルできるようなcodeを実装できるのでしょうか。
[ 標準C言語仕様はOSに依存しないし、TCP/IP自体もOSに依存しないはずなので、少なくとも原理的的には可能かな。]
OSに依存しないEthernet通信アプリケーション(C言語)
Re: OSに依存しないEthernet通信アプリケーション(C言語)
Boost.Asioのような,OS依存を内部に隠しているライブラリを使えば可能です。
そもそも,現時点において標準のC/C++にTCP/IPを直接扱うライブラリが存在しません。
このため,TCP/IPを扱う方法は処理系に依存してしまいます。
そもそも,現時点において標準のC/C++にTCP/IPを直接扱うライブラリが存在しません。
このため,TCP/IPを扱う方法は処理系に依存してしまいます。
Re: OSに依存しないEthernet通信アプリケーション(C言語)
パソコとキーエンスの機器を組み合わせてビルの制御(空調の制御から電気代の店ごとの分担まで..)を経験したけど。現在は、PLCにも、Ethernetが標準的になっていて大量のI/Oを取り扱いたい場合、PLCにI/Oを取り込んでEthernetでPCに繋いで、制御プログラムをPCで構築するという方法になったようです。
C++レベルでの共通化は難し...。Windows10ではネイティブでLinuxが動きます!(MicrosoftもUnix for Windows を昔からやっていた)PowerShellがフリーになりLinuxにのるという事なので共通化の道は開けるかも...
C++レベルでの共通化は難し...。Windows10ではネイティブでLinuxが動きます!(MicrosoftもUnix for Windows を昔からやっていた)PowerShellがフリーになりLinuxにのるという事なので共通化の道は開けるかも...
Re: OSに依存しないEthernet通信アプリケーション(C言語)
Boost.Asio は初めて聞きました。さすが Boost、とんでもない代物ですね。
現実的には、C 言語以外の言語を選択するのが近道のように思えます。流行りでいえば Go 言語とかですかね。
確かに TCP/IP プロトコルは OS 非依存ですが、そのプロトコルに基づいたパケット データを送受信するのはネットワーク カードで、そのデバイスを操作するためのドライバーを操作する方法が OS 依存になってしまい、OS 非依存の C 言語のコードというのは現時点では無理だと思います。vbんcvbn さんが書きました: [ 標準C言語仕様はOSに依存しないし、TCP/IP自体もOSに依存しないはずなので、少なくとも原理的的には可能かな。]
現実的には、C 言語以外の言語を選択するのが近道のように思えます。流行りでいえば Go 言語とかですかね。
Re: OSに依存しないEthernet通信アプリケーション(C言語)
YuO様、みえ様、Math様
ご教授ありがとうございます。
みえ様、Math様からのメッセージがとても啓発的で勉強になりました。
YuO様のお返答がまさに私が期待しているLIBにぴったりようで、
ご紹介のサイトから下記のTCP/IPやsocket に関するサイトにたどり着きましたが、
http://www.boost.org/doc/libs/1_63_0/do ... orial.html
このサイトで論じられた事はEthernetに関係あるかどうか分からなくなります。
これまで自分の経験だと、Ethernet利用の場合は必ずTCP/IPやsocketという概念が出て、それに必ずIPアドレスの指定を行います。
ところが、上記サイトページの中にIPアドレスの指定とか一切せずにいろいろ例を挙げております。
それから、時々timeやtimerと絡みながら進められてきます。
いったい、このサイトが論じている事柄の趣旨は何でしょうか。
そこのcode例がEthernet通信アプリケーションに利用できるのでしょうか。
どうぞ宜しくお願い致します。
ご教授ありがとうございます。
みえ様、Math様からのメッセージがとても啓発的で勉強になりました。
YuO様のお返答がまさに私が期待しているLIBにぴったりようで、
ご紹介のサイトから下記のTCP/IPやsocket に関するサイトにたどり着きましたが、
http://www.boost.org/doc/libs/1_63_0/do ... orial.html
このサイトで論じられた事はEthernetに関係あるかどうか分からなくなります。
これまで自分の経験だと、Ethernet利用の場合は必ずTCP/IPやsocketという概念が出て、それに必ずIPアドレスの指定を行います。
ところが、上記サイトページの中にIPアドレスの指定とか一切せずにいろいろ例を挙げております。
それから、時々timeやtimerと絡みながら進められてきます。
いったい、このサイトが論じている事柄の趣旨は何でしょうか。
そこのcode例がEthernet通信アプリケーションに利用できるのでしょうか。
どうぞ宜しくお願い致します。
Re: OSに依存しないEthernet通信アプリケーション(C言語)
正しいチュートリアルを参照されていますよ。このチュートリアルでは、13/tcp 及び 13/udp ポートを使う daytime プロトコルで会話するクライアントとサーバーをそれぞれ作成しています。
サーバー プログラムを実行すると、そのマシンの 13/tcp もしくは 13/udp ポートのリッスンを開始します。ポート番号はハードコードされています。
クライアント プログラムは、コマンド引数としてサーバーの宛先を受け取ります。上記サーバーを動かした状態で、そのサーバーの IP アドレスなりホスト名なりを指定してクライアントを実行すると、サーバー側で取得した時間の情報が Ethernet 経由で送られてきてクライアント側に出力される、という動作をします。
vbんcvbnさんの実現したいことが「シーケンス制御装置とデータや命令のやりとり」ということは、おそらくシーケンス制御装置がサーバーになるのですよね。したがって作るものはクライアント プログラムになるかと思います。また、使用するプロトコルはおそらく TCP ではないかと思いますので、チュートリアルで言えば "Daytime.1 - A synchronous TCP daytime client" を理解することが重要です。
コードは単純で、1) 宛先とポート番号の情報をもとにソケットを開いて、2) ソケットからデータを受信している、だけです。例えば、サンプルの中で
となっている部分を
と変えると、192.168.0.1:8888 に接続しにいくはずです。その後、daytime のクライアントは socket.read_some で受信しているだけですが、write か何かでパケットを送信できるはずです。
チュートリアル以外にも、以下のページに豊富にサンプルがありました。参考になれば幸いです。
http://www.boost.org/doc/libs/1_63_0/do ... mples.html
サーバー プログラムを実行すると、そのマシンの 13/tcp もしくは 13/udp ポートのリッスンを開始します。ポート番号はハードコードされています。
クライアント プログラムは、コマンド引数としてサーバーの宛先を受け取ります。上記サーバーを動かした状態で、そのサーバーの IP アドレスなりホスト名なりを指定してクライアントを実行すると、サーバー側で取得した時間の情報が Ethernet 経由で送られてきてクライアント側に出力される、という動作をします。
vbんcvbnさんの実現したいことが「シーケンス制御装置とデータや命令のやりとり」ということは、おそらくシーケンス制御装置がサーバーになるのですよね。したがって作るものはクライアント プログラムになるかと思います。また、使用するプロトコルはおそらく TCP ではないかと思いますので、チュートリアルで言えば "Daytime.1 - A synchronous TCP daytime client" を理解することが重要です。
コードは単純で、1) 宛先とポート番号の情報をもとにソケットを開いて、2) ソケットからデータを受信している、だけです。例えば、サンプルの中で
となっている部分を
と変えると、192.168.0.1:8888 に接続しにいくはずです。その後、daytime のクライアントは socket.read_some で受信しているだけですが、write か何かでパケットを送信できるはずです。
チュートリアル以外にも、以下のページに豊富にサンプルがありました。参考になれば幸いです。
http://www.boost.org/doc/libs/1_63_0/do ... mples.html
Re: OSに依存しないEthernet通信アプリケーション(C言語)
みえ様
丁寧なご指導本当にありがとうございました。
親切なご説明のおかげでやっと分かるような気がしました。
(自分の頭脳レベルとみえ様のとの差が大きいとも分かりました。(o.o;
丁寧なご指導本当にありがとうございました。
親切なご説明のおかげでやっと分かるような気がしました。
(自分の頭脳レベルとみえ様のとの差が大きいとも分かりました。(o.o;