この記事は2020年06月08日に投稿しました。
目次
リンク
1. はじめに
こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているC++/CLIでTCPクライアント処理を行う方法についてです。
2. C++/CLIでTCPクライアント処理を行う
C++/CLIでTCPクライアント処理を行うには、以下のような実装になります。
実装例
TcpClient.h
#pragma once using namespace System; using namespace System::Text; using namespace System::Threading; using namespace System::Net::Sockets; public ref class TcpClientManager { public: TcpClientManager(); TcpClientManager(Encoding^ encoding); bool Connect(String^ ipAddress, int portNo); String^ Communicate(String^ send); void Close(); private: void Initialize(Encoding^ encoding); private: TcpClient^ mTcpClient; Encoding^ mEncoding; };
TcpClient.cpp
#include "TcpClientManager.h" using namespace System::IO; using namespace System::Diagnostics; /** * @brief コンストラクタ * 文字エンコーディングはデフォルトUTF8とします。 */ TcpClientManager::TcpClientManager() { Initialize(Encoding::UTF8); } /** * @brief コンストラクタ * * @param [in] encoding 文字エンコーディング */ TcpClientManager::TcpClientManager(Encoding^ encoding) { Initialize(encoding); } /** * @brief サーバに接続します。 * * @param [in] ipAddress サーバのIPアドレス * @param [in] portNo サーバのポート番号 * @return 処理結果(true:成功/false:エラー) */ bool TcpClientManager::Connect(String^ ipAddress, int portNo) { try { mTcpClient = gcnew TcpClient(); mTcpClient->Connect(ipAddress, portNo); return true; } catch (Exception^ e) { Debug::WriteLine(e->Message); if (mTcpClient) { mTcpClient->Close(); } return false; } } /** * @brief データを送信し、サーバからのデータを受信します。 * * @param [in] send 送信データ * @return 受信データ */ String^ TcpClientManager::Communicate(String^ send) { try { // TCPクライアントが無効な場合 if (!mTcpClient) { // 空文字列を返却します。 return String::Empty; } // 送信用と受信用のストリームを取得します。 NetworkStream^ stream = mTcpClient->GetStream(); StreamWriter^ writer = gcnew StreamWriter(stream, mEncoding); StreamReader^ reader = gcnew StreamReader(stream, mEncoding); // データを送信します。 writer->WriteLine(send); writer->Flush(); // サーバからのデータを受信します。 String^ recieve = reader->ReadLine(); return recieve; } catch (Exception^ e) { Debug::WriteLine(e->Message); return String::Empty; } } /** * @brief TCPクライアントをクローズします。 */ void TcpClientManager::Close() { if (mTcpClient) { mTcpClient->Close(); mTcpClient = nullptr; } } /** * @brief 初期化処理を行います。 * * @param [in] encoding 文字エンコーディング */ void TcpClientManager::Initialize(Encoding^ encoding) { mEncoding = encoding; }
main.cpp
#include "TcpClientManager.h" int main() { // サーバに接続します。 TcpClientManager^ manager = gcnew TcpClientManager(); bool result = manager->Connect("127.0.0.1", 1234); // エラーの場合 if (!result) { // 終了します。 return -1; } // 終了コマンドが入力されるまで繰り返します。 while (true) { // コンソールから送信データを入力します。 String^ send = Console::ReadLine(); // 終了コマンド(\E)の場合 if (send->ToUpper()->Equals("\\E")) { // ループを終了します。 break; } // データを送信し、サーバからのデータを受信します。 String^ recieve = manager->Communicate(send); // 受信したデータを表示します。 Console::WriteLine(recieve); } // TCPクライアントをクローズします。 manager->Close(); return 0; }
3. おわりに
前回
に引き続き、今回はクライアント側の処理です。
リンク
紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。
私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリやウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。
また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688