まさおです。「ネットワークスペシャリスト」とよばれる資格を一応持っています。もしかしたら、資格取得時には「テクニカルエンジニア(ネットワーク)」とよばれていたかもしれませんが、同じものです。
スポンサーリンク
ソケットで簡単にプログラミングできる
とあるおっさんが言いました。
「ネットワークなんてソケットで簡単だろ。別に考えなくても誰でもできる」
なんとも心強い発言です。簡単にできればいいに越したことはありません。しかし後日、ずーっと原因不明のバグに悩んでいるとのことです。何日もだそうです。
面倒なので関わらないことにしていましたが、さらに数日たって泣きついてきました。助けてほしいと。素直に教えてほしいと頼めばいいのですが、プライドが邪魔しているのでしょうか、どことなく偉そうです。
仮にこのおっさんをCさんと呼ぶことにします。
おっさんが解決できない問題
C「UDPでブロードキャスト送信して受信者がそのレスポンスを返すが、そのレスポンスを受信できない」
ま「そうですか」
C「なぜ?」
ま「しらん」
地頭の悪い人間はこのように、漠然とした聞き方をしてきます。プログラミングは確かにとっかかりの敷居は下がりました。現在では、どのような言語でもライブラリも用意されています。ネットワークだってプログラミングは簡単にできることでしょう。
しかし、いくら簡単にできるからといっても基本的な学習は必要です。また、プログラマーがライブラリを魔法の道具のように考えるようになったらエンジニア人生はジ・エンドです。
今回はどのような問題があったか
では、実際にどのような問題だったかと言いますと、
- ブロードキャストアドレス宛にUDPの送信はOK
- ブロードキャストアドレスの受信もOK
- レスポンスの宛先ポート番号がNG
- レスポンスの受信部分がそもそも実装されていないアホNG
ハイ注目です。ネットワークを知らない人間がプログラミングをするとこのような結果になります。ネットワークに限らずなにやらせてもダメだと思いますが。
まず、レスポンスの宛先ポート番号ですが、相手の送信元ポート番号宛にレスポンスを返すようにしていました。ドシロートのくせに自信満々のドヤ顔で「問題ないでしょ」と言ってきます。
もちろんブロードキャスト送信時に送信元ポート番号を指定しているわけでもありません。あからさまにコピペプログラミングです。情けない限りです。
そしてレスポンスの受信部分もなにか受信しようとしているッぽいですが、まったく話になりません。むしろ、コンパイルエラーにならないのが不思議なレベルです。
レスポンスを受信するための、バインド、リッスンといった記述がどこにも見当たりません。そもそも設計でもレスポンスの送信先ポート番号が記述されていません。必要ないと考えていることが読み取れます。
おそらく、TCPの送受信をコピペで簡単にできた経験があるので、UDPも同じでよいと思ったと思ったのでしょうが、同じならTCPとかUDPとか各々に存在する必要がありません。
送信部分だけ見てもパラメータも違います。送信ごとにIPアドレスやポート番号をTCPでは指定していましたか?
もちろん、そんなことは覚えているとは到底思えませんが、バッサリとダメ出ししておきました。そして、ダメ出しだけして手は動かさないと心に決めました。ババひく可能性200%の予感です。
(本日の愚痴、おわり)