初めて質問させていただきます。よろしくお願いします。
最近、ネットワークプログラミングの勉強をしているのですが、bindについてよくわからなくなってきました・・・。よろしければご教授願います。
質問内容は以下の通りです。
(1)bindにおける設定内容は、「相手側のIPとポート番号」なのか「自分側のIPとポート番号」なのか?
色々なところを調べてみましたが、「IPとポート番号」を設定する、としかかかれてなく、いったいどっちなのかがわからなくなってきました・・・。
(2)UDP通信において、bindは必要なのか?
サーバ-クライアントの関係が曖昧なUDP通信において、bindというのは必要なのでしょうか。
私の認識では例えば、「recv関数」などを使い受信待ちをする場合はbindが必要だが、送信だけの場合には不要であるとなっています。
この認識はあっているのでしょうか。
拙文ですが、どうか教えていただきたく <(_ _*)>
No.2ベストアンサー
- 回答日時:
TCP/UDP通信がどのように働くかを考えれば、疑問の答えが分かるのでは?
bindについて言えば
「OSはマシンに届いたパケットを如何にして該当プログラムに届けるか?」
です。
自分のポート番号をOSに教えてあげなければ、OSは着信したパケットをどのプログラム(プロセス)に届けるか分からないでしょう。それをするのがbindの役割です。
従って(1)は自ポート番号。IPは複数IPを持っているマシンで一部IPでのみ受け付ける場合に必要ですね。
一般的にサーバでbindするタイミングでは相手のIPやポート番号は不明ですから、要求されても困りますね。
(2)は質問者さんの認識通り。受信のために必要、送信では不要です。
質問した後、実は試しに相手側のIPやポート番号を設定するなど、色々なことを調べていました。回答が遅くなり申し訳有りません。
試した結果、相手側のIPやポートを設定すると、bindでエラーが帰ってきて、自動で自分のIPやOS割り振りのポート番号が設定されました。(Win2008server VC2010)
他にもワイヤーシャークにご登場願い、気になる箇所を色々と調べて勉強することが出来ました。
的確な回答ありがとうございます。
ベストアンサーとさせていただきます。
No.1
- 回答日時:
大分前にUDPを使った通信ミドルウェアを書いておりました。
関数仕様は調べ直しました。
(1)受け付けるIPアドレス(のようです)
見かけたサンプルでは、INADDR_ANYを設定しています。
これは”誰からもでも受け付ける”と言う意味になるそうです。
ここは呪文と思って入れておきましょう。
(2)必要です
受信、送信関数のパラメータ構造を見るとわかるのですが、
送信関数のほうでは、あて先などの付加情報としてsockaddr_in構造体を
直接与える仕様になっているようです。
受信側はあらかじめbind()を使用してソケットに付加情報を設定する感じですね。
ネットワークプログラムを書くときは、デバッグが難しいので気をつけましょう。
まずはネットで公開されている完全動作するサンプルをそのまま使用し、
ハードウェアや回線上の問題が無いかチェックしてから考えましょう。
C言語やC++を使ったプログラム開発の良さは、アルゴリズムを勉強するだけで、殆どの
高機能ライブラリを自作できる事です。
簡単な送受信として紹介されるサンプルが多いですが、この”簡単な”が付く意味は、
「この程度ではまともな通信が出来ません」
と言うことだと思います。
受信側がブロックする(データが到着するまでrecv()関数から戻らない)ことも想定し
て、スレッド機構を使う方法を勉強をする必要があります。
また、大量に送信すると、送信関数の中でブロックする(しばらく戻ってこない)場合
もあります。
通信が絡むものは難関であり、特にUDPを使っているケースは少なく、通信プロトコルの
基礎から一読しておくと良いと思います。
用語が多いので混乱する分野だと思いますが、コンピュータとはまた別の世界として、
その特質を掴む事が大事です。
UDPを使うことで、TCPに制約される性能劣化は殆ど解消されますが、
同時に通信スタック(安定した通信を目指して、機能や役割を整理し、積み上げたもの)
を独自に作らないといけません(プログラムで何とかするわけです)
ご存知と思いますが、UDPは順序制御や再送制御が行なわれません。
・パケットの到着順序が保障されない
・パケットが欠損する可能性がある
これらを補完する機構を自分で作らないといけません。
また、通信バッファが溢れた場合の同期処理、フロー処理なども必要です。
さらに、こうした事故に対してのエラー通知機構が必要になります。
と言う事で、最初にメモリバッファの作り方などを勉強しておく必要があります。
FIFOキューの様な機構が必須になりますよ。
メーカー次元でも、だいたいは玉砕してしまい、TCPベースのプロトコルや製品を採用する
ところが多いわけです。
以上参考になれば
ご丁寧な回答ありがとうございます。
実は自作プログラムが、UDPの「パケットの到着順序が保障されない」という特徴が悪さをして(たと思う)、謎のエラーをはいていました。
そのために仕様面からの再学習を行っていて、疑問に思ったので質問をさせていただきました。
ん~・・・順序制御とか再送とか考えると多分とんでもないことになりそうですし、少しどうするか考えてみます<(*_ _)>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
【お題】 ・存在しそうで存在しないモノマネ芸人の名前を教えてください
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
【お題】引っかけ問題(締め切り10月27日(日)23時)
【大喜利】 「日本で一番高い山は富士山……ですが!」から始まった、それは当てられるわけ無いだろ!と思ったクイズの問題
-
ちょっと先の未来クイズ第4問
11月ごろに発表される、2024年の「新語・流行語大賞」にノミネートされる言葉を書けるだけ書いてください。
-
「お昼の放送」の思い出
小学校から中学校、ところによっては高校まで お昼休みに校内放送で、放送委員が音楽とかおしゃべりとか流してましたよね。 最近は自分でもラジオができるようになって、そのクオリティもすごいことになっていると聞きます。
-
UDP通信する時に、相手にどうやって自分のポート番号を教える?
Java
-
UdpClient 送信元のIPアドレスの指定方法
C言語・C++・C#
-
socket: recvはいつ,どれだけ受け取るのか?
C言語・C++・C#
-
-
4
UDP受信時の通信異常検知について
C言語・C++・C#
-
5
C言語のsocket関数で、複数NIC実装PCはどうなるのでしょうか?
C言語・C++・C#
-
6
ソケット通信 同じポート番号でn対1はできない?
C言語・C++・C#
-
7
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
8
VC++ 2008 EXPRESS _T"識別子がみつかりません"
C言語・C++・C#
-
9
VB6のwinsockでconnectできない
Visual Basic(VBA)
-
10
C言語での引数の省略方法
C言語・C++・C#
-
11
socketでの複数NICの扱い
C言語・C++・C#
-
12
WaitForSingleObjectの使い方について
C言語・C++・C#
-
13
UDPのソケットプログラミング
C言語・C++・C#
-
14
同じLAN内パソコンのIPアドレス、もしくはホスト名の自動取得方法
C言語・C++・C#
-
15
C++言語で、構造体のコピーは可能(しても良い)のでしょうか?
C言語・C++・C#
-
16
外部依存関係について
C言語・C++・C#
-
17
コマンド(例えばls)の出力結果を文字列で取得するプログラムの作成方法
C言語・C++・C#
-
18
C言語のポインターに関する警告
C言語・C++・C#
-
19
recv関数でフリーズしてしまう
C言語・C++・C#
-
20
TCP/IP のパケットの分断と結合について
UNIX・Linux
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
ソケットでクライアントのipア...
-
VB6のwinsockでconnectできない
-
TCPによるファイル転送
-
Winsockプログラミング Connec...
-
recv関数でフリーズしてしまう
-
ソケット通信 同じポート番号...
-
UDP通信する時に、相手にどうや...
-
Winsockで接続待ちタイムアウト...
-
UDPを使って通信速度測定プログ...
-
非ブロッキングソケットのrecv...
-
Socketの使用方法について
-
メッセージを受信したら受信終...
-
TCP/IP通信(ソケット通信)に...
-
Macターミナルで実行中のプログ...
-
バックグラウンドのプロセスの...
-
家電製品の電力周波数を変える機械
-
大容量のメモリ確保をスワップ...
-
VBSの処理中一旦処理を止めて再...
-
プロダクションコードとは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
エクセル VBA でのCOMポート...
-
ソケットのrecvの戻り値が0
-
recv関数でフリーズしてしまう
-
VB6のwinsockでconnectできない
-
UDP通信する時に、相手にどうや...
-
UDP通信におけるbind関数について
-
ソケットでクライアントのipア...
-
Socket通信の0バイト受信について
-
ソケット通信 同じポート番号...
-
UdpClient 送信元のIPアドレ...
-
Winsockで接続待ちタイムアウト...
-
ソケットのクローズについて
-
ソケットを用いた1対多通信につ...
-
Connectエラーが出てしまう・・...
-
Socket通信を待ち受け状態にす...
-
非ブロッキングソケットのrecv...
-
CreateFile関数でCOMポートが開...
-
同じLAN内パソコンのIPアドレス...
-
WinSockでの通信プログラムがう...
おすすめ情報