先週火曜日は電車がちゃんと動くようになったのでやけにがらがらな電車に乗って出勤したんだが、午後になって今週は自宅待機なと言われたのですごすご帰ってきた。そして先週いっぱい自宅待機。
節電とか言われてるし計画停電もあるので何をするか悩んだが、積んである本を読むことに。と思ったら弟が来るかもしれないとか言い出したので、人が入れる状態じゃない部屋の片付けをすることに。 来ないにしても部屋の片付けはやっといた方がいいのでまったりとやってたんだけど、木曜夜になって明日行くわと言われたので金曜は大急ぎで片付け。人が入れる程度には片付いたよ!
あとは弟が来て軽くゲームやったり遊びに行ったっきり帰ってこないのを待ってたり12時間近く寝てるのを放っておいたりした。
休日は停電が基本無いようなので配信とかもできるんだなーと確認。まあ今後はどうなるのか知らんけど。つか駅の近くだからなのかわからんけどうち一度も停電してないようなんだけど。
イベントは延期ということにしたんだけど、延期していつにしたものか。4月の三連休ってゴールデンウィークに突入するんだよなぁ。あと1ヶ月以上延びちゃうのはどうだろう。といっても平日にやったり二日だけにするってのもなんか変だから4月29日からにしちゃおうかなぁ。
上手く動いてると思ったらリレーした時に自分のホスト状態が上手く相手に伝わっていない。
調べたら自分のIPアドレスを上手く相手に伝えられてないようだ。しかし自分のIPアドレスってどう取得してどう保持してるのかちゃんと把握してないんだよな…。 ちゃんとソースを読むか…。
各ノードのホスト情報には2つのアドレスを保持している。一つはグローバルアドレス、もう一つはLAN内のローカルアドレス。これがHost構造体のrhost[2]フィールドにそれぞれ0、1として入ってる。配列にすんなよ、どっちがどっちだかわからんだろ…。
配列で持ってるから最初は増減できるものと勘違いしてたけど、そうでもなくてきっかり2つだけ保持しているようだ。あと最初は0がLAN内アドレスだと思ってたけど1だった。
LAN内のアドレスは自分のホスト名をDNSで引いて取得してる。これじゃちゃんとしたアドレス引けないこともあるんじゃねーの?と思うが現状問題出てないのでまあいいことにして同じ方法で取得するようにした。
グローバルアドレスはYPかトラッカーに初めてアクセスした時のPCP_OLEHにくっついてくるPCP_HELO_REMOTEIPの値を入れる。PCP_HELO_REMOTEIPにはソケットの接続相手のアドレスを入れるからグローバルアドレスが入ってることが期待できるってわけな。まあYPもトラッカーもLAN内だったらグローバルアドレスの取得は無理なんだけどそれはもう諦めるみたい。べつにいいしね。
あとはPCP_HOSTの時にグローバルアドレスとローカルアドレスをくっつけてみんなに教えてあげるだけだ。
さてその使いわけは?基本はグローバルアドレスでアクセスするんだけど、自分と相手のグローバルアドレスが同じだった場合はLAN内とみなしてローカルアドレスを使う。なるほどな。
あとは自分が外から接続可能な状態にあるかどうかも判別しないといけない。接続可能かどうか不明な状態ではトラッカーやYPへの接続時PCP_HELOにPCP_HELO_PINGをくっつけてやる。PCP_HELO_PINGを受け取ったらPCP_HELO_PINGの値で指定されたポートにPCPで接続に行ってPCP_HELOを送ってみる、ということをやる。これが上手くいけばPCP_OLEHにPCP_HELO_PORTとして接続できたポートを設定して返す。上手くいかなかったらPCP_HELO_PORTはつけないか0を設定して返すってことをやる。
PCP_OLEHにPCP_HELO_PORTが無いか0が設定されてたら、ああ俺は外からアクセスできないのねーと判別するわけだ。
ちょっとばかし問題があるのは、この接続可能判定は一回しかやらないのであとからポートを開放したりしても無駄だという点。 それと、接続可能判定が上手くいったかどうかにかかわらず、自分のグローバルアドレスに192.168.x.xみたいなプライベートアドレスが入ってきたら接続不能判定になる。
後者は理解できるんだが、前者と組み合わさるとちょっと変なことに。一回LAN内のトラッカーやYPにアクセスするとずっと接続不能判定になっちゃうの! まあでもいいのか。LAN内かインターネットのどっちかで運用しろって話か。両方混ぜると確かに変なことになるしな。