OSに依存しないEthernet通信アプリケーション(C言語)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
vbんcvbn

OSに依存しないEthernet通信アプリケーション(C言語)

#1

投稿記事 by vbんcvbn » 8年前

シーケンス制御装置とデータや命令のやりとりをEthernet経由でやりたいですけれども、
C++で実現したい場合、WindowsとLINUX 両方ともコンパイルできるようなcodeを実装できるのでしょうか。

[ 標準C言語仕様はOSに依存しないし、TCP/IP自体もOSに依存しないはずなので、少なくとも原理的的には可能かな。]

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: OSに依存しないEthernet通信アプリケーション(C言語)

#2

投稿記事 by YuO » 8年前

Boost.Asioのような,OS依存を内部に隠しているライブラリを使えば可能です。

そもそも,現時点において標準のC/C++にTCP/IPを直接扱うライブラリが存在しません。
このため,TCP/IPを扱う方法は処理系に依存してしまいます。

Math

Re: OSに依存しないEthernet通信アプリケーション(C言語)

#3

投稿記事 by Math » 8年前

パソコとキーエンスの機器を組み合わせてビルの制御(空調の制御から電気代の店ごとの分担まで..)を経験したけど。現在は、PLCにも、Ethernetが標準的になっていて大量のI/Oを取り扱いたい場合、PLCにI/Oを取り込んでEthernetでPCに繋いで、制御プログラムをPCで構築するという方法になったようです。
C++レベルでの共通化は難し...。Windows10ではネイティブでLinuxが動きます!(MicrosoftもUnix for Windows を昔からやっていた)PowerShellがフリーになりLinuxにのるという事なので共通化の道は開けるかも...




みえ
記事: 23
登録日時: 8年前

Re: OSに依存しないEthernet通信アプリケーション(C言語)

#4

投稿記事 by みえ » 8年前

Boost.Asio は初めて聞きました。さすが Boost、とんでもない代物ですね。
vbんcvbn さんが書きました: [ 標準C言語仕様はOSに依存しないし、TCP/IP自体もOSに依存しないはずなので、少なくとも原理的的には可能かな。]
確かに TCP/IP プロトコルは OS 非依存ですが、そのプロトコルに基づいたパケット データを送受信するのはネットワーク カードで、そのデバイスを操作するためのドライバーを操作する方法が OS 依存になってしまい、OS 非依存の C 言語のコードというのは現時点では無理だと思います。

現実的には、C 言語以外の言語を選択するのが近道のように思えます。流行りでいえば Go 言語とかですかね。

vbんcvbn

Re: OSに依存しないEthernet通信アプリケーション(C言語)

#5

投稿記事 by vbんcvbn » 8年前

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通信アプリケーションに利用できるのでしょうか。

どうぞ宜しくお願い致します。

みえ
記事: 23
登録日時: 8年前

Re: OSに依存しないEthernet通信アプリケーション(C言語)

#6

投稿記事 by みえ » 8年前

正しいチュートリアルを参照されていますよ。このチュートリアルでは、13/tcp 及び 13/udp ポートを使う daytime プロトコルで会話するクライアントとサーバーをそれぞれ作成しています。

サーバー プログラムを実行すると、そのマシンの 13/tcp もしくは 13/udp ポートのリッスンを開始します。ポート番号はハードコードされています。
クライアント プログラムは、コマンド引数としてサーバーの宛先を受け取ります。上記サーバーを動かした状態で、そのサーバーの IP アドレスなりホスト名なりを指定してクライアントを実行すると、サーバー側で取得した時間の情報が Ethernet 経由で送られてきてクライアント側に出力される、という動作をします。

vbんcvbnさんの実現したいことが「シーケンス制御装置とデータや命令のやりとり」ということは、おそらくシーケンス制御装置がサーバーになるのですよね。したがって作るものはクライアント プログラムになるかと思います。また、使用するプロトコルはおそらく TCP ではないかと思いますので、チュートリアルで言えば "Daytime.1 - A synchronous TCP daytime client" を理解することが重要です。

コードは単純で、1) 宛先とポート番号の情報をもとにソケットを開いて、2) ソケットからデータを受信している、だけです。例えば、サンプルの中で

コード:

tcp::resolver::query query(argv[1], "daytime");
となっている部分を

コード:

tcp::resolver::query query("192.168.0.1", "8888");
と変えると、192.168.0.1:8888 に接続しにいくはずです。その後、daytime のクライアントは socket.read_some で受信しているだけですが、write か何かでパケットを送信できるはずです。

チュートリアル以外にも、以下のページに豊富にサンプルがありました。参考になれば幸いです。

http://www.boost.org/doc/libs/1_63_0/do ... mples.html

vbんcvbn

Re: OSに依存しないEthernet通信アプリケーション(C言語)

#7

投稿記事 by vbんcvbn » 8年前

みえ様
丁寧なご指導本当にありがとうございました。
親切なご説明のおかげでやっと分かるような気がしました。
(自分の頭脳レベルとみえ様のとの差が大きいとも分かりました。(o.o;

返信

“C言語何でも質問掲示板” へ戻る