日本語の文字列を送信するには、文字列のエンコーディングを指定して送信します。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//文字列をUTF8で送信する
IdUDPServer1->Send("127.0.0.1", 12345, "てすと", TEncoding::UTF8); //自分自身に送信
}
受け取ったときにはバイト列を文字列にデコードします。
void __fastcall TForm1::IdUDPServer1UDPRead(TIdUDPListenerThread *AThread, _ARRAYOF BYTE* AData,
const int AData_Size, TIdSocketHandle *ABinding)
{
//受け取ったバイト列をデコードする
UTF8String s((char*)AData, AData_Size + 1);
…
}
次のサンプルプログラムは「ソケットライブラリのIndyを利用したクリップボード共有ソフト:CodeZine」の「UDPの基本的な使い方」のを参考にしました。
フォームにTIdUDPServer・TButton・TMemoを貼り付けます。
ソースコードは次のようになります。
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
// コンポーネントの設定
Memo1->Text = "";
IdUDPServer1->DefaultPort = 12345; //適当なポートを使用
// UDPサーバーを起動する
IdUDPServer1->Active = true;
}
//---------------------------------------------------------------------------
// ボタンを押したら自分に対し'test'を送信する
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//文字列をUTF8で送信する
IdUDPServer1->Send("127.0.0.1", 12345, "てすと", TEncoding::UTF8); //自分自身に送信
}
//---------------------------------------------------------------------------
// データを受信した時
void __fastcall TForm1::IdUDPServer1UDPRead(TIdUDPListenerThread *AThread, _ARRAYOF BYTE* AData,
const int AData_Size, TIdSocketHandle *ABinding)
{
//受け取ったバイト列をデコードする
UTF8String s((char*)AData, AData_Size + 1);
Memo1->Lines->Add(s);
}