結局、こんな感じにuPnPを試しました。uPNPの1900はXP以降だとOSのサービスでも起動されるものがあるため、自側のポートが同じだと都合が悪いようです。
(別途、OSのサービスを停止すれば、送信側が1900でも動きます)
------dll_net_function.pas
//---
try
p.PortNo := StrToIntDef(getToken_s(s, ':'), 80);
except on e: Exception do
raise Exception.Create('ポート番号が解決できません。');
end;
if s <> '' then
begin
try
p.OwnHost := getToken_s(s, ':');
except on e: Exception do
raise Exception.Create('自ホスト名が解決できません。');
end;
try
p.OwnPortNo := StrToIntDef(s, p.PortNo);
except on e: Exception do
p.OwnPortNo := p.PortNo;
end;
end else begin
p.OwnHost := '';
p.OwnPortNo := p.PortNo;
end;
------
------UdpUnit.pas
// 外部との対話用の接続管理
FHost : string; // 接続先
FPortNo : Integer;
FOwnHost : string; // 自側Host
FOwnPortNo : Integer;
// イベント用
------
------UdpUnit.pas
property Host: string read FHost write FHost;
property PortNo: Integer read FPortNo write FPortNo;
property OwnHost: string read FOwnHost write FOwnHost;
property OwnPortNo: Integer read FOwnPortNo write FOwnPortNo;
end;
------
------UdpUnit.pas
// ポートの設定
FSockAddr.sin_port := htons(FOwnPortNo);
FSockAddr.sin_family := AF_INET;
if FOwnHost = '' then
begin
FSockAddr.sin_addr.S_addr := INADDR_ANY;
end else begin
FsockAddr.sin_addr.S_addr := inet_addr(PAnsiChar(FOwnHost));
end;
------
------nakonet.nako
・ポート{=60001}
・ホスト{=『225.0.0.0』}
・自ポート{=『』} # 接続の時点で、1以上:その値 空:ポート同じ 0:自動
・自ホスト{=『』} # 接続の時点で、空:ADDR_ANY IP:ネットワークIFのIP
------
------nakonet.nako
・接続~
UDP_COMMAND(UDPID,"connect","{ホスト}:{ポート}:{自ホスト}:{自ポート}")
------