UDPとTCPと
UDPソケットプログラミングをしていて、ちょっといろいろとはまってしまったので、
それについてまとめてみました。
普通、ネットワークについて勉強していると、トランスポート層の例としてUDPとTCP
が出てきて、
って習いますよね。例えば、
https://www.itbook.info/study/tcp3.html
で解説されているような感じ。
だから、TCPはコネクションを張ってから安全にストリームをやりとり、UDPはコネクションを
用いずいきなりデータグラムを飛ばす、、というイメージ。
ところが、UDPのライブラリを見ると、必ず「connect」というメソッドが出てきます。あれ?
UDPってコネクションレスなのに、どうしてconnect?
Stackoverflowとかで、UDPのコネクションについての質問とかみると、よく「UDPはコネクションレスだ。
お前の言っているコネクションの定義は?」みたいなコメントがついているけど、、、、
というか、調べると普通に載っていて、例えば
http://www.asahi-net.or.jp/~aa4t-nngk/ipttut/output/udpconnections.html
な〜んだ、コネクションあるじゃん、、。
とはいえ。
それでもUDPではコネクションを使うのは一般的ではないらしい。そして、上のサイトにもあるように、
UDPコネクションは、スレートレスなコネクションであって、「接続の確立」「クローズ」といったものも
ないようだ。
じゃあ意味ないの?
いや、すごい大切な意味があるのです。(たぶん)
というのも、UDPは、データグラムを送りっぱなしの仕組みなので、そもそもデータを受け取る相手が
本当にいるのかどうかよくわからないプロトコルです。
データを受け取る側の実装がよく分かっていれば問題ないのですが、一般的には、相手がデータを受け取る
準備ができているのかどうかよく分からない、、。
そんな時、コネクションを使うとよいようです。コネクションを張った状態で、ダミーのデータを送り、
そしてデータの読み取りをすると、
1. 相手が存在する場合は、何らかのデータを返してくるか、もしくは無反応。
2. 相手が存在しない場合は、ICMP Unreachableエラー
になります。このICMP Unrechableエラー(パケットキャプチャしてればこれがちゃんと送られてくる
はずなのだけど、送り側まで届くのかは不明。でもまあ、GCDAsyncUdpSocketライブラリでは、少なくと
も強制的にNetwork closedされる)を得られることが大切であって、これでデータを受け取る相手が存在
するかしないかを判定することが出来ます。
あ、、、もしかしたら、コネクションを張らないでも、他に方法があるのかも知れませんが、、。
僕はいろいろ頑張ってみたものの、コネクションを張ることでうまく出来たので、これでヨシとしました。
あまりネットワークに強くないので、このあたりのプログラミングは気を使います。
もっと良い方法をご存知の方がいれば、ご教示いただきたいです。
SublimeText3が、、、
突然、sublime text 3がアップデートの通知が来て、アップデートされた。アップデート後のバージョンは3.0 Build 3143
それはいいのだが、タブエリアとフッターエリアなどの色がおかしくなってしまった。何このグラデーション!
PreferenceからColor Schemeなどを変更しても全然治らない、、。
もう一度Sublime Textをクリーンインストールするしかないのだろうか、、、、と思い、まずはプラグインディレクトリ(Preference -> Browse Packagesで表示されるディレクトリ)の中身を一度消してみた。(後で戻すと、別の場所にmoveさせておいた)
すると、色がおかしいのはなおった!!!
で、どれが原因なのか、一つずつプラグインを戻してくと、なぜか全部戻しても色は正常なまま。最初、プラグインを全部一度に戻したときは色がおかしいのが再現したので、結局原因は分からず。
まあいいか。
不審なサインイン
メールをチェックしてたら、Microsoftアカウント「不審なサインイン」のお知らせが来ていた。管理画面でチェックすると、
IP => いつものIP
場所 => 大阪
時間 => 自分が使っていない時間
だったので、慌ててパスワード変更。
でも、なんかおかしいと思って再度確認してみると、、、
場所 => 現在の接続も大阪になってた。誤判定っぽい
時間 => 「昨日のxx時」と表示されてるが、テーブルの一番上を見るとGMTって書いてあった。日本時間に直したら、PC使ってた時刻だった。
それでも、Microsoftにログインした覚えないな、、と思って履歴チェックしてたら、英単語調べてる時、一度だけBingで検索してて、その時、自動ログインしていたっぽい。