Server端bind本機のIPアドレスはINADDR_を使用します。ANY

3333 ワード

  bind    INADDR_ANY,                ,       /  IP        ,             。
一般的には、ネットワークサーバのアプリケーションを確立するには、サーバーのオペレーティングシステムに通知します。アドレスxx.xxx.xxx.xxx上のポートyyyy上でリスニングし、聞いたデータパッケージを私に送ってください。このプロセスは、ビッドシステムを通じて呼び出しが完了しました。つまり、あなたのプログラムはサーバのあるアドレスをバインドします。あるいはサーバのある住所のポートをすでに使っています。サーバーの操作システムはこの指定された住所をあげてもいいです。あげなくてもいいです。
もしあなたのサーバーが複数のネットワークカード(それぞれのネットワークカードには異なるIPアドレスがあります)を持っているとしても、あなたのサービス(Dupポートで聞いても、tcpポートで聞いても)は、何らかの理由でサーバの操作システムがいつでもIPアドレスを増減する可能性がありますし、サーバ上にどんなネットワークポートがあるかを確認するのを省略するためにも可能です。サービスプログラムは0.0.00にこのアドレスでリスニングします。たとえば:
Protto Recv-Q Send-Q Local Addreign Address(state)
……
up 4 0*.7913*.
up 4 0*.7911*.
tcp 4 0*.ftp*.LISTEN
……
……
これらはネットワークリスニングの場合であり、ここでLocal Addressは「*.ftp」、「*.7911」などであり、サービスプログラムがサーバにバインドされたすべてのネットワークカードを表している。
はい、わかりました。INADDR_を聞きます。ANYはどういう意味ですか?それなら、私のサーバーにはN個のIPアドレスがあります。重複したパケットが届きますか?パケットを受け取ったら、クライアントに返信を繰り返しますか?
回答は、重複したパケットは受信されませんし、データも繰り返し送信されません。
なぜですか?ルートの関係で、クライアントから来たIPパケットはその中の一つのネットワークカードにしか到達しません。同時にサーバープロセスでデータを送信する場合、オペレーティングシステムは、自身が維持しているルーティングテーブルに基づいて、IPパケットがどのoutboundのgatewayからターゲット側に送信されるべきかを決定する。gatewayの選択によって、どのネットカード/どのIPアドレスから送るかが決まります。
なぜ重複したパケットが受信されないですか?
クライアントはあなたのサーバー上の唯一のIPアドレスにのみデータを送信します。
なぜ重複してパケットを送らないですか?
答:パケットを送信するルート(経路)は一意です。サーバーがデータを送信する際にどのアドレスにデータを送信するべきかわからない場合、データは「デフォルトゲートウェイ」に送信されます。
データを送る経路はどう選択しますか?
ルーティングテーブルの要求に従って送信します。
もしルーティングテーブルの記録が重複/衝突している場合、どうやって経路を選択しますか?
ルーティングテーブルの記録は優先順位があります。一般的には、Windowsオペレーティングシステムのルーティングテーブル記録は、重複している場合は、後で加入したレコードが基準であり、リンクス/FreeBSDのようないくつかのオペレーティングシステムは重複したルーティングテーブル記録に加入してはいけない。
専用のルータであれば、ルート選択アルゴリズムがあり、一般的には、ネットワーク上のある一点に至るルートは多くのルートがあります。ルートの選択アルゴリズムは「一番いいパス」を確定できます。このパスは遅延が一番小さいか、或いは通信費が一番低いか、或いは帯域幅が一番高いか、或いはジャンプポイントが一番小さいか――どうやって選択するかは、ルータの管理人がどのように配置するかを見ます。
クライアントにINADDR(u)を紐付けするとANY、状況は似ています。TCPについては、connect()システム呼び出し時に、具体的なIPアドレスにバインドされる。選択した根拠は、このアドレスがあるサブネットからターゲットアドレスに達することができるということです。この場合はget sockname()システムの呼び出しで、どの住所を具体的に使うかが分かります。UDPにとっては特別なケースです。connect()システムを使っても特定のアドレスに縛られません。これはUDPにconnect()を使うためです。本当に接続を確立したデータを宛先アドレスに送信したり、宛先アドレスの到達性を検証したりはしません。ターゲットアドレスの情報を内部のsocketデータ構造に記録して、後で使用します。sendto()/send()を呼び出したときだけ、システムカーネルがルートテーブルによってどのアドレス(LANカード)でUDP packetを送信するかを決定します。
P.S.
-----------------------------------------------
IP層にはルートテーブルがあります。
MSDOSウィンドウでコマンドを実行できます。netstat-r
を選択して、ルーティングテーブルを表示します。指定されたカードからルーティングテーブルの項目に従ってデータを送信します。
ARPキャッシュ用:arp-a
を選択します
通常イーサネットフレームの宛先MACアドレスは、次のホップのMACアドレスである。
 
 
Server端bind本機のIPアドレスとポートの場合、一部のプログラムはINADDRAGANYというアドレスを使って本機のアドレスを置換します。これはなぜですか?  printfを入れてINADDRAGANYをプリントアウトしてみましたが、意外にもゼロでした。  いくつかの資料とコードを調べましたが、MACではINADDRUANYはIN.hで定義されています。
ヽoo。ツ。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。      (uyint 32_t)0 x 0000
だからプリントアウトはゼロです。
このマクロ定義はいったいどういう意味ですか?  このマクロは、プログラマが本機のIPアドレスを知らない場合に、本機のすべてのインターフェースのIPアドレスを表しています。つまり、このマクロをモニターアドレスとして使うと、本機がどれぐらいのインターフェースを持っていても、socketが傍受します。  例えば、ホストがinter 1、inter 2、inter 3のインターフェースがあると仮定し、一つのsocketがINADDR_uANYのアドレスと8000のポートを結びつけると、クライアントから来た一つのUDPパッケージがホストに到達し、クライアントconnectのがinter 1、inter 2、inter 3のどのアドレスであっても、このsocketに受信される。このポートとアドレスは最初のsocketによって傍受されました。
上は受信の場合ですが、データをクライアントに送信する時は、どのインターフェースで送信しますか?  これは、自機のルーティングテーブルの構成状況に応じて、最適な経路に対応するインターフェースを選択して送信することです。