返答ありがとうございます。
ルーターとか、そういうネット環境のもとで、実際に自分自身でで扱わないと、判らない見たいです。
サンプルとかヘルプだけでは限界があります。
何とか知り合いとかで、ルーターを使っている人を見つけてみます。
ちなみに、下のはUPnP_test2のリスト。
肝心のUPnP部分は、PCBNET2のサンプルのマルパクリです。
#include "pcbnet2.as"
title "UPnPテスト2"
screen 0,640,480
sdim ip
gmode 2
*online
exist "online.dat"
if strsize=-1{
myname=""
myport=""
onlinedata=""
}else{
notesel onlinedata
noteload "online.dat"
noteget myname,0
noteget myport,1
myport=0+myport
}
cls
color 1,1,1
font "MS ゴシック",32,1
mes "PUnPテスト2"
font "MS 明朝",16,1
pos 0,40:mes "※テストを行う前に、インターネットに接続してください。"
font "MS ゴシック",16,1
pos 0,132
mes "解放ポート番号(49152〜65535の間の番号)を選んでください"
input myport,38,,5
pos 0,256
button goto "接続開始",*name_pass_check
flag=stat
stop
*name_pass_check
color 255,255,255
boxf 0,320,639,479
color 0,0,0
port=int(myport)
if port=0{
mes "ポート番号を入力してください"
stop
}
if port<49152 or port>65535{
mes "49152〜65535の間で選んでください"
stop
}
port=0+port
goto *host2
*host2
cls
tcpmake lis_sock,port ;リッスンソケットを作る
if stat!0{
gosub *tusinerr ;stat変数が0でないと、エラー。0だとソケット制作完了
gosub *lis_sock_end
goto *owari
}
myip=""
ownip myip //自分のIPアドレスを取得
isip myip
if stat=2 : priv=1
//IPアドレスの種別も判別
//0=IPアドレスでない
//1= 一般IPアドレス
//2=プライベートIPアドレス
//3=マルチキャストIPアドレス
mes "ローカルアドレスは"+myip+"です."
if priv {
mes "プライベートアドレスです."
mes "インターネットゲートウェイの検出中..."
*@
natinit
if stat=0 : wait 1 : goto *@b
if stat=1 {
mes "インターネットゲートウェイが検出されました."
mes "ポートマッピングを登録しています..."
natbind lis,PORT
if stat=3 {
dialog "UPnP NAT Traversalが利用できません。"
end
}
*@
natcheck lis
if stat=0 : wait 1 : goto *@b
if stat>1 {
dialog "Bindに失敗しました."
}
else {
exaddr=refstr //refstrにに割り当てられたアドレスが"IPアドレス:ポート番号"の形式で格納されます
getstr nat_ip,exaddr,0,':' //IPアドレスだけを取得
a=strsize
b=strlen(exaddr)
nat_port = strmid(exaddr,a,(b-a))
mes "グローバルIPアドレス="+nat_ip
mes "ポートNo.="+nat_port
}
}
else {
dialog "インターネットゲートウェイが検出できませんでした."
end
}
}else{
nat_ip=myip:nat_port=myport
}
mes "待機を開始します..."
wait 100
mes "接続を待ちます"
mes "グローバルIPアドレス="+nat_ip
mes "ポートNo.="+nat_port
repeat
tcpwait lis_sock ;クライアント接続を待機する
if stat>1{
dialog "tcpwaitエラー "+stat
gosub *lis_sock_end
goto *owari
}
if stat=1{
tcpaccept mysock,lis_sock ;子ソケットに接続
if stat!0{
dialog "tcpacceptエラー "+stat
gosub *lis_sock_end
goto *owari
}
gosub *lis_sock_end
break
}
wait 1
loop
*mescheck ;相手のメッセージの受信待ちの処理
tcpfail mysock //ソケットがエラー状態か判断
if stat=1{
dialog "接続成功 ! "+stat
gosub *sock_end
goto *owari
}
if stat>1{
dialog "tcpfileエラー "+stat
gosub *sock_end
goto *owari
}
//ちなみにstat=1だと、送信のみは可能。それ以外は通信不可能
tcpcount data,mysock ;受信バッファにあるデータのサイズを取得する。
//data変数にデータサイズが記録されると、データを受信したことになる。0だとまだ来てない。
if data>0{
dialog "バッファの中身 "+data
gosub *sock_end
goto *owari
}
;data変数が0以上だとデータを受信
await 50 ;20フレームで受信を待ちます
goto *mescheck ;data変数が0だと、ループして受信を待ちます。
*tusinerr
return
*sock_end
tcpclose mysock ;接続されているソケットを切断
return
*lis_sock_end
tcpclose lis_sock ;接続されているlis_sock を切断
return
*owari
end
tcpclose mysock ;接続されているソケットを切断