C++でTCP/IPソケットを超簡単に扱うサンプルコード(動的ポリモーフィズム)

2020/04/06

C/C++ 技術

t f B! P L

さて、前回は2種類C++で役に立つサイトを紹介してみました。

今回はそれらのサイトに書いてあることを利用するとどんなことが出来るのか?
という紹介記事です。

ちなみにサンプルコードは掲載していますが、
非常にオーソドックスなTCP/IPソケットの例なのでやり尽くされた感はありますし、思ったより行数が増えたので敢えてエラー処理を一切合切そぎ落としています。

なので、ご利用は計画的に

まずはサンプルコード



ざっと概要を説明すると、純粋仮想クラスでインターフェースの実装を強制した上で、サーバとクライアントのラッパクラスを作成、ホストクラスで使い分ける。

それだけです。

まぁそれだけで結構な行数使ってしまったわけですが、それは私の能力のなさでしょうね……

まぁいいや

インターフェースの実装強制


class TCPIPInterface
    {
        public:
        virtual void create_connection() = 0;
        virtual void write_data(const char* data, size_t data_length) = 0;
        virtual void read_data(char* data, size_t data_length) = 0;

        virtual void wait_for_incomming(){ return; };
    };

おそらくC#を組む方なら見慣れていると思うのですが、インターフェースを定義することで、俯瞰すると定型的な処理の実装を強制しています。
個人開発では冗長な実装ではあるのですが、チーム開発を行う上ではこうした縛りを規定しておくことはじわじわ効いてきます。
同時にCIサーバを運用する上でも、このようなインターフェースで開発者がいじれる個所を絞っておくことは、テストケース、テストパターンの削減につながります。

おそらくはここが最もツッコミが入るところだと思うのですが、高速な静的ポリモーフィズムを使用せずに、動的な純粋仮想クラスによるポリモーフィズムを使用しているのは、私の職場で使っている開発環境をC++17で規定しているため、自宅で組むときもそれに合わせているからです。

C++20を使用するのであれば、conceptを使用して簡単に実装できるので、自分で作ったルールとは言えそこは完全に自分の首を絞めましたね…


TCP/IPのポリシークラス


class ServerPolicy : TCPIPInterface
         //以下略
    class ClientPolicy : TCPIPInterface
         //以下略

Cで書かれているSocket.hのラッパークラスです。
説明することは特にないと思います。

ホストクラス


template
    class TCPIPHostClass : public T_policy
        //以下略

ポリシーに基づく設計のホストクラスに当たります。

しかし、Hostとか名前つけちゃうとネットワークのホストなんだかホストクラスなんだかわけわからないですねwまぁだっと作ってだっと公開したからいいけど

呼び方


TCPIPHostClass/lt;serverpolicy/gt;
    tcpip_object(testip.ip_value, 10101);
    tcpip_object.create_connection();
    tcpip_object.wait_for_incomming();
    tcpip_object.read_write_data(test, sizeof(test), buffer, sizeof(buffer));
適当にサーバだけ呼んでいます。

一応同じソースからサバクラそれぞれバイナリ作って、接続できることは確認しましたが……

テンプレートの特殊化の時点でサーバとクライアントを書き分けるだけで、このソースコードから作るソフトウェアがたった一行の変更でサーバにもクライアントにもなりますまぁ簡単!お買い得ぅ!

さいごに

今回はやり尽くされた感のある内容をやりました。
Boostのようなライブラリの使用できる開発現場であればほぼ使うことはないと思うやり方ですが、もし昔の仕様で苦労している方がいるのであれば、そういう方の少しでも助けになれればと思います。

Translate

ページビューの合計

注意書き

基本的にごった煮ブログですので、カテゴリから記事を参照していただけると読みやすいかと存じます。

ADBlocker等を使用していると、Twitterやアクセスカウンタが表示されません。

記事を読むには差し支えませんが、情報を参照したい場合には一時例外にしていただけると全てご参照いただけます。

Featured Post

ボイドラDICEの攻略法

QooQ