C++ Builder CE ネットワークプログラミング

TCPの通信をTClientSocketで行う 送信受信

IndyのTCP通信のコンポーネントを使う例を以前の記事で示しましたが、今回はTClientSocketで行います。TClientSocketは標準ではインストールされていないので、まずインストールから行います。といってもどこからかダウンロードする必要はないです。

まず上図のようにトップメニューのコンポーネント->パッケージのインストールを選択、

”追加”ボタンを選択し、パスを“Program Files(x86)\Embarcadero\Studio\23.0\bin\”とたどると

以下の画面になるので、ファイル名に“dclsockets”まで入れると下図のように選択できるものが出てきますから、“dclsockets290.bpl”を選んで”開く”。(Version 12の場合です。)

下図で、“追加”を選択、

ここで保存。ここでフォームデザインのパレットを見ると、”Internet”というジャンルの下に

というようにTClientSocketとTServerSocketが見えるようになります。これを一つフォーム上にドロップします。TIdTCPClientと似ていますが、TClientSocketはIndyファミリーではありません。

さらにフォーム上に、TButtonx3,TMemox1を追加して、以下のように置きます。

Button1から3をダブルクリックし、ClientSocke1のイベントタブ以下の”OnRead”をダブルクリックして、以下のコードを足します。まとめてUnit1.cppごと示します。

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	ClientSocket1->Host = "192.168.0.230";
	ClientSocket1->Port = 25;



}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket)

{
	AnsiString response;

	response = Socket->ReceiveText();

	Memo1->Lines->Add(response);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   ClientSocket1->Active = true;



}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
     ClientSocket1->Socket->SendText("EHLO localhost\n");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{

		ClientSocket1->Socket->SendText("Quit\n");
}
//---------------------------------------------------------------------------

これでBuild & Run(F9)してみましょう。あ、忘れずにBuildする前にセーブしておきます。

ボタン1から3までをクリックすると、

こんな感じで受信結果が表示されますが、何をやっているかというと、local ip アドレス”192.168.0.230”のホストの25番ポート(SMTPのポート)へ、順次

EHLO localhost
Quit

を送った時のホスト側の応答になります。smtpプロトコルのテストですね。普通のsmtpセッションの場合であれば、そもそも25番ポートは通りませんが、これはlocal ip <-> local ipなので通ります。この後は、”認証”を経てメール送信セッションに移りますが、それは別記事で。今回は既存サーバーにちょっかい出してみることで、TClientSocketのテストに替えました。送信は、

    ClientSocket1->Socket->SendText("送信したい文字列\n");

受信は、

	AnsiString response = Socket->ReceiveText();

で、repsonseに受信したテキストが入ります。極めて簡便ですね。

コメント