初めて質問させていただきます。よろしくお願いします。
最近、ネットワークプログラミングの勉強をしているのですが、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
-
C言語のsocket関数で、複数NIC実装PCはどうなるのでしょうか?
C言語・C++・C#
-
WinSockを用いたUDP送受信ソケットプログラミングについて
C言語・C++・C#
-
-
4
UDP受信時の通信異常検知について
C言語・C++・C#
-
5
UdpClient 送信元のIPアドレスの指定方法
C言語・C++・C#
-
6
socketでの複数NICの扱い
C言語・C++・C#
-
7
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
8
UDPのソケットプログラミング
C言語・C++・C#
-
9
UDPの宛先ポートと送信元ポートについて
C言語・C++・C#
-
10
UDP処理のエラーについて
Visual Basic(VBA)
-
11
recv関数でフリーズしてしまう
C言語・C++・C#
-
12
C# ソケット通信でデータ受信時の欠損について
C言語・C++・C#
-
13
UDPでマルチスレッドは可能か
C言語・C++・C#
-
14
Linuxでパケットを発信する際・・・。
その他(プログラミング・Web制作)
-
15
charからLPTSTRへの変換方法
C言語・C++・C#
-
16
TCP/IPでのgetsockname()の使い方を教えてください
C言語・C++・C#
-
17
WinsockAPIのrecvfromの受信データがおかしい
Visual Basic(VBA)
-
18
winsockで複数のLANカードを使用するには
C言語・C++・C#
-
19
socket: recvはいつ,どれだけ受け取るのか?
C言語・C++・C#
-
20
VC++ 2008 EXPRESS _T"識別子がみつかりません"
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信する時に、相手にどうや...
-
サーバーソケットを開いたまま...
-
UdpClient 送信元のIPアドレ...
-
パケット通信時のIPヘッダの取...
-
ソケット通信のシミュレータツ...
-
Winsockで接続待ちタイムアウト...
-
JAVAでソケット通信(クライア...
-
recv関数でフリーズしてしまう
-
Socket通信での通信異常について
-
UDPの宛先ポートと送信元ポート...
-
バインドと接続(BindException...
-
ラズパイでのシリアル通信、音...
-
vbでの232c接続プログラムについて
-
ソケットのrecvの戻り値が0
-
割り込み処理について
-
非ブロッキングソケットのrecv...
-
CreateFile関数でCOMポートが開...
-
TCP/IP通信でのコネクシ...
-
クライアントソケットMACアドレ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
エクセル VBA でのCOMポート...
-
UDP通信する時に、相手にどうや...
-
UDP通信におけるbind関数について
-
UdpClient 送信元のIPアドレ...
-
Winsockで接続待ちタイムアウト...
-
recv関数でフリーズしてしまう
-
ソケットのクローズについて
-
ソケットのrecvの戻り値が0
-
Socket通信の0バイト受信について
-
ソケット通信 同じポート番号...
-
相手のIPアドレスを取得する方法
-
ソケットでクライアントのipア...
-
VB6のwinsockでconnectできない
-
Connectエラーが出てしまう・・...
-
ソケット通信の送受信遅延-02 ...
-
同じLAN内パソコンのIPアドレス...
-
WinSockでの通信プログラムがう...
-
UDPのソケットプログラミング
-
非ブロッキングソケットのrecv...
おすすめ情報