動作確認
C++ builder XE4
updサーバー
server.cpp
#include <IdUDPServer.hpp>
...
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
IdUDPServer1->DefaultPort = 6000;
IdUDPServer1->Active = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdUDPServer1UDPRead(TIdUDPListenerThread *AThread, const TIdBytes AData,
TIdSocketHandle *ABinding)
{
UTF8String str;
int init_pos = 0;
str = TEncoding::UTF8->GetString(AData, init_pos, AData.Length);
Memo1->Lines->Add(str);
}
(追記 2017/02/22)
受信文字列に<0xE2>
などのASCII以外のコードが入っている場合、strはNULLになるようだ。
例としてAAA<0xE2>
を受信したとしても、上記のstrはNULLになる。
server.h
...
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <IdBaseComponent.hpp>
#include <IdComponent.hpp>
#include <IdSocketHandle.hpp>
#include <IdUDPBase.hpp>
#include <IdUDPServer.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE で管理されるコンポーネント
TIdUDPServer *IdUDPServer1;
TMemo *Memo1;
void __fastcall IdUDPServer1UDPRead(TIdUDPListenerThread *AThread, const TIdBytes AData,
TIdSocketHandle *ABinding);
private: // ユーザー宣言
public: // ユーザー宣言
__fastcall TForm1(TComponent* Owner);
};
...
イベント
OnUDPRead = IdUDPServer1UDPRead
UTF-8でなくSJISの場合は
String rcvdStr;
Idglobal::_di_IIdTextEncoding encSJIS;
encSJIS = IndyTextEncoding(932);
int init_pos = 0;
rcvdStr = encSJIS->GetString(AData, init_pos, AData.Length);
udpクライアント
client.cpp
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
IdUDPClient1->Port = 6000;
IdUDPClient1->Host = L"127.0.0.1";
IdUDPClient1->Active = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
IdUDPClient1->Send(
Edit1->Text,
IndyTextEncoding(TEncoding::UTF8)
);
}