SSブログ

golangでUPnPのポートフォワーディングをしてみる6−最後 [プログラミング]

やっと実際のポートフォワーディングをUPnPでするまでに辿り着きました。というか、結論を言ってしまえば、UPnPでポートフォワーディングするのはあまりお勧めできません。恐らく、多くのルーターで動かないものができてしまいがちだからです。まぁルーターの実装が悪いからだからなんですが、一部でもできるものをできないと言うのも問題なので、一応最後までやってみようとしています。実際やろうとするならIPv6とかでやるべきなのかもしれないですね。どうやってやるかは調べてないので具体的にはわかりませんが…。

具体的なやり方としては、下のサイトにほとんどを頼った形になってます。それはグローバルアドレスを取るときも一緒でした。結局、具体的なPOSTデータを何を出せばいいかというのが、きっちりわかったので非常に有用でした。

http://manabu.quu.cc/up/6/e62532.htm

最終的には何のプログラミング言語を使うにしても、プロトコルとして何をしているのかがわかれば実装できるのですね。なのでこういうサイトはありがたいのであります。あとはどう自分の使う言語に落とし込むかって話なので、そこは各自にやればいいって話で。

ただ今回はやらないけれどもSSDPの改行文字は\r\nで\nじゃない気はするんですが、気になる人は両方やって見てください。UPnPはMSが言い出しっぺだと思ったので、\r\nでやるかと思ったんですがどうでしょうか。

やってる本体の部分は前回とあんまり変わらないんですけど、自分のIPを取ったりWebサーバを立ち上げたりしているので他に考えることは少し多い気はします。それと本当ならXMLの中身を見て、きちんとポートフォワーディングがサポートされているかどうか見ないといけないんだけど、どうせできないものはできないので確認作業はしなくてできるものとして考える。どうせできるものはできるし、できないものはエラーが出て転ぶんだろうし。



Access URL: http://xxx.xxx.xxx.xxx:8080/hello
と出てくると思うので、そのアドレスで自宅とは別回線でアクセスすれば、
This is an example server.
と表示されます。具体的にはWiFiを切った携帯で上のURLにアクセスするということです。晒しているサーバと同じネットワークからアクセスしても自分のネットワークには到達しません。まぁそれは何でポートフォワーディングしていても同じことですけどね。

最後にControl+CでWebサーバを終わるとき、ポートフォワーディングを削除したいんだけど、これではできていないっぽい。気になる人は単体で削除するコードを書いてもいいと思います。コードを切り離してあげれば動くと思います。

あとstringにしたり[]byteにしたり無意味なことをしていますが、ただ単に行きがかり上そうなっただけで深い意味はありません。もう直すのも面倒なので…。あと外に晒すポートとクライアントが開くポートは必ずしも同じにする必要はありません。面倒臭いので同じにしているだけで、違うものにする必要がないと思っただけです。

これでとりあえずポートフォワーディングの件は終わりです。というか、あまりにルーター側の不備が発覚したので呆れました。これじゃ、UPnPでポートフォワーディングを標榜しているソフトは、半分のルーターでは動作しないんじゃないかな。でも、できないというわけではないので、広くサポートしようとすると困難であるということなのでしょう。

IPv6でできるならやるべきなのかも。それもルーターが何かしら噛んできそうなので厳しいかもしれない。外にサーバ作って認識させるってのがP2Pでも使う方としてはお手軽なのでしょうね。

タグ:Golang
コメント(0) 
共通テーマ:パソコン・インターネット

コメント 0