
初めて質問させていただきます。よろしくお願いします。
最近、ネットワークプログラミングの勉強をしているのですが、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で質問しましょう!
似たような質問が見つかりました
- ルーター・ネットワーク機器 YAMAHAルータ設定について 1 2022/09/03 16:31
- 固定IP Win11 アダプター設定変更にイーサネットが表示されない 1 2022/12/03 18:31
- その他(メールソフト・メールサービス) Windows10付属のメール、なぜ設定が劇的に簡単になったのか? 1 2022/12/16 13:14
- その他(IT・Webサービス) どうしたらGoogleの電話番号認証をさせなくすることができるか? 2 2022/04/09 10:48
- ダイヤルアップ Raspberry Piでアナログモデム経由で音声再生 1 2022/05/20 18:01
- その他(スマートフォン・携帯電話・VR) SMSの受信について LINEの設定において、設定途中のSMSの受信ができなくて困っています。 私は 3 2023/08/03 11:53
- ルーター・ネットワーク機器 AU光10G回線について 6 2022/07/25 00:12
- ファイアウォール ポート開放で利用可能なTCP一覧の中に利用したいTCPが入ってない場合どうすればいいのでしょうか? 2 2022/09/12 10:31
- iCloud iPhone端末変更時のLINE引継ぎ 4 2023/07/09 15:07
- Windows 10 リモートデスクトップ接続 1 2022/07/12 14:30
このQ&Aを見た人はこんなQ&Aも見ています
-
UDP通信する時に、相手にどうやって自分のポート番号を教える?
Java
-
UDP/IPでのソケット作成について(winsock)
C言語・C++・C#
-
TCPサーバ bind関数のエラーについて
C言語・C++・C#
-
-
4
UdpClient 送信元のIPアドレスの指定方法
C言語・C++・C#
-
5
WinsockAPIのrecvfromの受信データがおかしい
Visual Basic(VBA)
-
6
TCP/IP のパケットの分断と結合について
UNIX・Linux
-
7
GetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・
C言語・C++・C#
-
8
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
9
Winsockで接続待ちタイムアウトを設定する方法
C言語・C++・C#
-
10
UDPパケットの分割について
その他(インターネット接続・インフラ)
-
11
winsockの動作について。
C言語・C++・C#
-
12
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
13
コンボボックスのドロップダウンリストが表示されない
C言語・C++・C#
-
14
UDPの宛先ポートと送信元ポートについて
C言語・C++・C#
-
15
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
VB6のwinsockでconnectできない
-
UDP通信する時に、相手にどうや...
-
UDP通信におけるbind関数について
-
ソケット通信
-
closeされたsocketへの動作につ...
-
送信したデータの一部が文字化...
-
VBのソケット通信(winsock)の...
-
recv関数でフリーズしてしまう
-
ソケットのrecvの戻り値が0
-
【ajax】 XMLHttpRequestオブジ...
-
VBとCでのソケット通信について
-
ソケット通信の送受信遅延-02 ...
-
ソケットのクローズについて
-
WinSockでの通信プログラムがう...
-
Socket通信の0バイト受信について
-
UDPの宛先ポートと送信元ポート...
-
Winsockで接続待ちタイムアウト...
-
Macターミナルで実行中のプログ...
-
C言語で、メモリを解放しないで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信におけるbind関数について
-
Winsockで接続待ちタイムアウト...
-
UDP通信する時に、相手にどうや...
-
エクセル VBA でのCOMポート...
-
Socket通信の0バイト受信について
-
VB6のwinsockでconnectできない
-
ソケットでクライアントのipア...
-
ソケットを用いた1対多通信につ...
-
ソケットのクローズについて
-
ソケットのrecvの戻り値が0
-
UdpClient 送信元のIPアドレ...
-
相手のIPアドレスを取得する方法
-
recv関数でフリーズしてしまう
-
closeされたsocketへの動作につ...
-
送信したデータの一部が文字化...
-
UDP通信(SNMP)したいが、うま...
-
ソケット通信
-
Connectエラーが出てしまう・・...
-
WinSockでの通信プログラムがう...
おすすめ情報