【症状】nakonetのUDPコンポーネントを利用して受信した場合、アプリケーションエラーとなってしまう。
【再現方法】以下のソースで確認(ただし、動作するかどうかはネットワーク環境に依存します)
-----
!変数宣言は必要
!初期化は必要
!「nakonet.nako」を取り込む。
CRとは文字列。
LFとは文字列。
CRLFとは文字列。
パケット1とは文字列。
接続状態とは整数
CR=「{\13}」
LF=「{\10}」
CRLF=「{CR}{LF}」
//※パケット1の中身は1行です。改行されてしまっていたら、つなげてください。
パケット1=「M-SEARCH * HTTP/1.1{CRLF}MX: 3{CRLF}HOST: 239.255.255.250:1900{CRLF}MAN: "ssdp:discover"{CRLF}ST: upnp:rootdevice{CRLF}{CRLF}」
//upnp:rootdevice
//ssdp:all
「起動中」と表示
接続状態は0
サーチとはUDP。
サーチのホストは「239.255.255.250」。
サーチのポートは1900。
サーチの受信した時は~
「受信!」を表示
サーチ→受信データを表示
サーチの接続した時は~
「接続!」を表示
接続状態は1
サーチのエラー時は~
「えらー:{サーチ→エラーメッセージ}」を表示
サーチの接続
1秒待つ
接続状態が0と等しいの間
1秒待つ
「時間経過・・・」と表示
パケット1を表示
パケット1をサーチの送信
「送信・・・?」を表示
10回
1秒待つ
「時間経過・・・」と表示
「時間切れ」と表示
サーチを切断
「UDP切断」と表示
-----
【要望】エラーとならず、処理を継続したい。
【バージョン】ソースリポジトリ上のrev273
【その他】
おそらくは、内部実装の変更の際に、変更漏れで中途半端な実装になっているようです。
以下の2ファイル、3か所の修正が必要。
TNakoUdpのメンバのInstanceVarを削除。どこからも設定がされてない。
------- KTCPW.pas
InstanceName: string;
udpid: Integer;
procedure setEvent;
-------
TNakoUdp.RecvDataにてInstanceVarを使う方法からInstanceNameの方法に変更。設定されないメンバ変数を参照してエラーになっている。
------- KTCPW.pas
Move(pData^, s[1], len);
s := InstanceName + '→受信データ=『' + s + '』;';
nako_evalEx(PANsiChar(s), p);
nako_var_free(p);
//
DoEvent('受信した時');
-------
TKUdpSocket.WndProc内のRecvPakcetの受信バイト数の変数はlenじゃなくてcnt。lenはaddr構造体の長さ。
------- UdpUnit.pas
if Assigned(FOnRecieve) then
begin
FOnRecieve(Self, @RecvBuf[1], cnt);
end;
-------