メモのコツを教えてください!

初めて質問させていただきます。よろしくお願いします。

最近、ネットワークプログラミングの勉強をしているのですが、bindについてよくわからなくなってきました・・・。よろしければご教授願います。

質問内容は以下の通りです。
(1)bindにおける設定内容は、「相手側のIPとポート番号」なのか「自分側のIPとポート番号」なのか?
 色々なところを調べてみましたが、「IPとポート番号」を設定する、としかかかれてなく、いったいどっちなのかがわからなくなってきました・・・。

(2)UDP通信において、bindは必要なのか?
 サーバ-クライアントの関係が曖昧なUDP通信において、bindというのは必要なのでしょうか。
私の認識では例えば、「recv関数」などを使い受信待ちをする場合はbindが必要だが、送信だけの場合には不要であるとなっています。

この認識はあっているのでしょうか。
拙文ですが、どうか教えていただきたく <(_ _*)>

A 回答 (2件)

TCP/UDP通信がどのように働くかを考えれば、疑問の答えが分かるのでは?


bindについて言えば
「OSはマシンに届いたパケットを如何にして該当プログラムに届けるか?」
です。
自分のポート番号をOSに教えてあげなければ、OSは着信したパケットをどのプログラム(プロセス)に届けるか分からないでしょう。それをするのがbindの役割です。
従って(1)は自ポート番号。IPは複数IPを持っているマシンで一部IPでのみ受け付ける場合に必要ですね。
一般的にサーバでbindするタイミングでは相手のIPやポート番号は不明ですから、要求されても困りますね。
(2)は質問者さんの認識通り。受信のために必要、送信では不要です。
    • good
    • 2
この回答へのお礼

質問した後、実は試しに相手側のIPやポート番号を設定するなど、色々なことを調べていました。回答が遅くなり申し訳有りません。

試した結果、相手側のIPやポートを設定すると、bindでエラーが帰ってきて、自動で自分のIPやOS割り振りのポート番号が設定されました。(Win2008server VC2010)

他にもワイヤーシャークにご登場願い、気になる箇所を色々と調べて勉強することが出来ました。

的確な回答ありがとうございます。
ベストアンサーとさせていただきます。

お礼日時:2013/10/20 19:20

大分前にUDPを使った通信ミドルウェアを書いておりました。


関数仕様は調べ直しました。

(1)受け付けるIPアドレス(のようです)
  見かけたサンプルでは、INADDR_ANYを設定しています。
  これは”誰からもでも受け付ける”と言う意味になるそうです。
  ここは呪文と思って入れておきましょう。

(2)必要です
  受信、送信関数のパラメータ構造を見るとわかるのですが、
  送信関数のほうでは、あて先などの付加情報としてsockaddr_in構造体を
  直接与える仕様になっているようです。
  受信側はあらかじめbind()を使用してソケットに付加情報を設定する感じですね。

ネットワークプログラムを書くときは、デバッグが難しいので気をつけましょう。
まずはネットで公開されている完全動作するサンプルをそのまま使用し、
ハードウェアや回線上の問題が無いかチェックしてから考えましょう。

C言語やC++を使ったプログラム開発の良さは、アルゴリズムを勉強するだけで、殆どの
高機能ライブラリを自作できる事です。

簡単な送受信として紹介されるサンプルが多いですが、この”簡単な”が付く意味は、

「この程度ではまともな通信が出来ません」

と言うことだと思います。
受信側がブロックする(データが到着するまでrecv()関数から戻らない)ことも想定し
て、スレッド機構を使う方法を勉強をする必要があります。
また、大量に送信すると、送信関数の中でブロックする(しばらく戻ってこない)場合
もあります。

通信が絡むものは難関であり、特にUDPを使っているケースは少なく、通信プロトコルの
基礎から一読しておくと良いと思います。
用語が多いので混乱する分野だと思いますが、コンピュータとはまた別の世界として、
その特質を掴む事が大事です。

UDPを使うことで、TCPに制約される性能劣化は殆ど解消されますが、
同時に通信スタック(安定した通信を目指して、機能や役割を整理し、積み上げたもの)
を独自に作らないといけません(プログラムで何とかするわけです)

ご存知と思いますが、UDPは順序制御や再送制御が行なわれません。

・パケットの到着順序が保障されない
・パケットが欠損する可能性がある

これらを補完する機構を自分で作らないといけません。
また、通信バッファが溢れた場合の同期処理、フロー処理なども必要です。
さらに、こうした事故に対してのエラー通知機構が必要になります。

と言う事で、最初にメモリバッファの作り方などを勉強しておく必要があります。
FIFOキューの様な機構が必須になりますよ。

メーカー次元でも、だいたいは玉砕してしまい、TCPベースのプロトコルや製品を採用する
ところが多いわけです。

以上参考になれば
    • good
    • 0
この回答へのお礼

ご丁寧な回答ありがとうございます。
実は自作プログラムが、UDPの「パケットの到着順序が保障されない」という特徴が悪さをして(たと思う)、謎のエラーをはいていました。
そのために仕様面からの再学習を行っていて、疑問に思ったので質問をさせていただきました。

ん~・・・順序制御とか再送とか考えると多分とんでもないことになりそうですし、少しどうするか考えてみます<(*_ _)>

お礼日時:2013/10/20 19:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A