golangでUPnPのポートフォワーディングをしてみる1 [プログラミング]
P2Pのソフトを作る上でルーターに穴を開けないといけなくなった。その点でUPnPを使うのが楽かなと思い、そこらへんの調査をしてみた。
Golangで実際動くものをと思ってミニマムなコードをでっち上げた。参考にしたコードは以下。
https://qiita.com/KyojiOsada/items/bc381b3058715d4011d2
https://github.com/syncthing/syncthing/blob/master/lib/upnp/upnp.go
めんどうなのでコメントを入れなかったけど、短いので逐一調べてもそれほど時間はかからないと思う。とりあえずSSDPを発行して、ルータの情報が入っているXMLのパスが入っているので、それはこれで取れる。
メッセージを送って受けるだけのミニマムなコードなのでわかりにくいことはないとは思うのですが、やっぱりXMLをパースしてパスを抽出するところまで書けばよかったかな?
ただ受け側の問題があり、SSDPのメッセージが複数届くので、そこのところを勘案すると少し面倒なのかもしれない。それにルーターだけではなく別のクライアントからも来るのでそれを見分けないと。タイミング的に他のメッセージが来た時にそれをはじくべく内容で選別しないといけないのです。でも、単純にこれという文字列がよく分からないんだよなぁ。それもルーターから複数くるので面倒臭い。
結局、Location: のなんとか.xmlを取ってくればよくて、ルーターからのメッセージには必ず(?)入っているので、ルータとわかるメッセージであれば何でもいいんですがね。決定的なタグの文字列があればいいんだけど…。
その中に書いてあるXMLのパスのXMLに使えるアクションが書かれているので、あったらそれを使うという具合になっているようです。別にXMLをダウンロードしてきて調べなくても、あると思って決め打ちでも動きそうなので、XMLをパースする作業はここではしません。後で考えることにします。
グローバルアドレスを取ってくるとかならあったりするのだけれど、下のところほど情報がなくて実際にどうしたらいいのか分からなかった。
http://manabu.quu.cc/up/6/e62532.htm
ここまで詳しく書いてくれていたら誰でも分かって嬉しい。上のサイトでポートマッピングのやり方がわかったんだけど、とりあえずグローバルアドレスを得ないとピアのクライアントに教えることもできないので、とりあえずルーターのIPがわかっている体でGolangのソースを書いて実際に取得してみる。
ん?なんかXMLの階層がへんな感じがする。他の無線LANルーターのXMLを見てみる。全然構造が違うじゃねぇか。普通XMLを使う時には、構造が規定されているため、所定の手続きをすれば同じタイプのXMLであればアクセスできるのだが、構造が違ったら順にタグの名前を辿って行く方法が使えない。
しょうがないので
SCPDURL
controlURL
eventSubURL
のタグ名で検索して、中の文字列を取ってくるやり方しかなさそうだね。バッティングしなければいいのだけれど…。普通はそういう使い方をしないので、サンプルがそういうのがないみたい。リファレンスの内容からスクラッチしないといけないのはしんどいな。
パースした体でメッセージを送ろうとしたけど、結局XMLを解析しなくてはいけないので、やっぱパースを後にするのはやめた。そもそもルーターごとに全然違う状況になっているから、文字列を決め打ちでやっても動作確認しかできない。
思ったよりも面倒くさくて一回で終わらなかった。次でXMLをパースして、そこから送り場所を得て、グローバルIPを取りたいと思う。そこからのポート開けのスマホからの別回線の確認をしてみたいと思う。
Golangで実際動くものをと思ってミニマムなコードをでっち上げた。参考にしたコードは以下。
https://qiita.com/KyojiOsada/items/bc381b3058715d4011d2
https://github.com/syncthing/syncthing/blob/master/lib/upnp/upnp.go
めんどうなのでコメントを入れなかったけど、短いので逐一調べてもそれほど時間はかからないと思う。とりあえずSSDPを発行して、ルータの情報が入っているXMLのパスが入っているので、それはこれで取れる。
メッセージを送って受けるだけのミニマムなコードなのでわかりにくいことはないとは思うのですが、やっぱりXMLをパースしてパスを抽出するところまで書けばよかったかな?
ただ受け側の問題があり、SSDPのメッセージが複数届くので、そこのところを勘案すると少し面倒なのかもしれない。それにルーターだけではなく別のクライアントからも来るのでそれを見分けないと。タイミング的に他のメッセージが来た時にそれをはじくべく内容で選別しないといけないのです。でも、単純にこれという文字列がよく分からないんだよなぁ。それもルーターから複数くるので面倒臭い。
結局、Location: のなんとか.xmlを取ってくればよくて、ルーターからのメッセージには必ず(?)入っているので、ルータとわかるメッセージであれば何でもいいんですがね。決定的なタグの文字列があればいいんだけど…。
その中に書いてあるXMLのパスのXMLに使えるアクションが書かれているので、あったらそれを使うという具合になっているようです。別にXMLをダウンロードしてきて調べなくても、あると思って決め打ちでも動きそうなので、XMLをパースする作業はここではしません。後で考えることにします。
グローバルアドレスを取ってくるとかならあったりするのだけれど、下のところほど情報がなくて実際にどうしたらいいのか分からなかった。
http://manabu.quu.cc/up/6/e62532.htm
ここまで詳しく書いてくれていたら誰でも分かって嬉しい。上のサイトでポートマッピングのやり方がわかったんだけど、とりあえずグローバルアドレスを得ないとピアのクライアントに教えることもできないので、とりあえずルーターのIPがわかっている体でGolangのソースを書いて実際に取得してみる。
ん?なんかXMLの階層がへんな感じがする。他の無線LANルーターのXMLを見てみる。全然構造が違うじゃねぇか。普通XMLを使う時には、構造が規定されているため、所定の手続きをすれば同じタイプのXMLであればアクセスできるのだが、構造が違ったら順にタグの名前を辿って行く方法が使えない。
しょうがないので
SCPDURL
controlURL
eventSubURL
のタグ名で検索して、中の文字列を取ってくるやり方しかなさそうだね。バッティングしなければいいのだけれど…。普通はそういう使い方をしないので、サンプルがそういうのがないみたい。リファレンスの内容からスクラッチしないといけないのはしんどいな。
パースした体でメッセージを送ろうとしたけど、結局XMLを解析しなくてはいけないので、やっぱパースを後にするのはやめた。そもそもルーターごとに全然違う状況になっているから、文字列を決め打ちでやっても動作確認しかできない。
思ったよりも面倒くさくて一回で終わらなかった。次でXMLをパースして、そこから送り場所を得て、グローバルIPを取りたいと思う。そこからのポート開けのスマホからの別回線の確認をしてみたいと思う。
タグ:Golang
2019-07-14 22:45
コメント(0)
Twitterまとめ投稿 2019/07/14 [Twitter]
carbonhydratRT @Beriozka1917: 安倍首相が表向き「お詫び」を述べる裏で「閣議決定」したハンセン病訴訟控訴取り下げに係る声明の何が凄いって、個別賠償義務の全否定に判決を違法扱いし批判。挙句の果てに関係閣僚と国会議員の責任までも全否定と、何もかも台無しにしている所。本当に「選挙…07/13 09:48 carbonhydratRT @ib_3rd: 少年革命家がいま話題になってるけど例の発言に大して太宰治が時を越えて論破してるから流石だなぁって https://t.co/qM7cqKeiWs07/13 09:50 carbonhydratRT @ShinHori1: 残業代は「時間内に仕事を終えられない労働者への補助金」ではなく、「時間内に終えられない程の仕事を与える使用者への罰金」ですよ。 https://t.co/0MtmaV3GGY07/13 09:54 carbonhydratRT @kj26csi: こういう実用化は素晴らしいけど、ただひたすらハスとか藻とかフジツボとかを研究している、「何の役に立つか分からない研究」無くして、こういう応用は決して成立たないんです。 一般の方々にはそのことを是非思って頂きたいです。 https://t.co/bwav…07/13 09:55 carbonhydratRT @cocorono121: 小泉純一郎氏が「だまされた私がアホ」と原発を推進してきたことが間違いだったと気づき反省していることは素直に評価できますが…竹中平蔵氏を重用し規制緩和の名の下に非正規雇用を増やし超格差社会の日本を作り上げた反省はいつになりますか?まだお気づきでは…07/13 09:55 carbonhydratRT @Beriozka1917: たつみコータロー街頭演説にて。 山本太郎「14年春に消費税は増税されて8%になった。政府は増税分を社会保障の充実と安定化に使うと約束した。しかし、社会保障の充実に使われたのはたった16%で社会保障予算4兆円削った。約束が違う」 「何となく…07/13 09:58 carbonhydratRT @oguchilaw: なにこれ、ありえないでしょ。 1 三権分立を、裁判を何だと思ってるんだ、この政府は 2 控訴しないのに、こんな形でウダウダ言うなよ 政府声明も閣議決定 ハンセン病判決に「法律上の問題」:朝日新聞デジタル https://t.co/MNdfocgv…07/13 10:24 carbonhydratRT @anfieldroad1: 主催の朝日新聞社が「女子部員の涙」みたいな記事を書いているのは許せない。自分たちで、ルール変えて出られるようにしてあげればいいじゃないか。泣かせているのはあなたたちでしょう。https://t.co/cfecra57j607/13 10:26 carbonhydratRT @tekina_osamu: 今日の日刊ゲンダイ。カルトの本性をあらわにしてきた安倍政権について。 https://t.co/x4dm4mXoyU07/13 10:29
2019-07-14 05:01
コメント(0)