プロが教えるわが家の防犯対策術!

C言語ですが、次のようにするとクライアントのipアドレスが
取得できるとのことですが、ここに入っているipアドレス(下記のdstAddr.sin_addr)
は、どういったものでしょうか?
例えば次の場合
クライアント --- プロキシサーバ  --- 端末

プロキシサーバのipアドレスですか?
それともクライアントのipアドレスですが?
それともナット変換前のipアドレスですか?

dstSocket = accept(srcSocket, (struct sockaddr *) &dstAddr, &dstAddrSize);
printf("Connected from %s\n", inet_ntoa(dstAddr.sin_addr));

ご教授して頂きたいです。
当方、C言語はまだ、2,3年と言ったところです。

A 回答 (4件)

これはプログラマでは分からないです。



エンド・ツー・エンドを中継している
機器がどういった環境に設定(設計)に
するかによります。

プログラマとしては、dstAddr.sin_addr
に入ったIPアドレスをもった相手と
通信を開始すると認識するしかないと
いうことです。

例えば、こんなネットワーク
Client  NAT  Server
□――C□B――□
A → A→B → D
A ← C←D ← D

このケースで、NATのアドレス変換
Aからの通信はNATで
Bからの通信に書き換えます。
Dからの通信はNATで
Cからの通信に書き換えます。

DはAからの通信はBから来たように
しかみえないし、
AはDからの通信はCから来たように
しかみえないのです。

つまりお互いA,DといったIPアドレス
を意識してはだめで、
Aの相手はC(実はD)
Dの相手はB(実はA)
と考えなければいけません。

このネットワーク環境はNATの
設定によりいろいろバリエーションが
ありますが、プログラムとしては
つなぎにきた相手に返すという形に
なるでしょう。

ということで、
上記環境を前提にした場合、
AからDに接続にきた時、
Dのプログラムが受ける
dstAddr.sin_addrに入る値は、
Bとなります。

いかがでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
まさに自分が知りたかったことを回答して
頂きましたね。
自分も、そうなんだろうなと思ってはいました。
実装できそうです。

お礼日時:2016/05/29 21:07

No.3です。



>ブラウザEXEプロセス(例えばIE)も同じ仕組みで、
>通信しているのでしょうか?
>どの言語で出来ているか分かりませんが、
>bindやlisten, accept, connetと等々しているのでしょうか?

サーバはsocket()→bind()→listen()→accept()です。
ブラウザ等のクライアントは普通、socket()→connect()です。
ただし、場合によっては(発IPやポート番号を固定にする場合など)connectの前にbindすることもあります。

bind, listen, acceptの機能をもう一度確認してみてください。
    • good
    • 0

これは、どちらの場合もあり得ます。


ただNo.1の方がおっしゃるように、
プログラミングの知識だけではわかりません。

ちなみに、「端末」がサーバでいいのかな?
取れるIPアドレスは、プロキシの種類によってどちらの場合もあり得ます。

「プロキシサーバ」がいわゆる普通のプロキシの場合、
プロキシサーバ上で待ち受けているプログラムが一旦「クライアント」からのリクエストを受け付け、
さらにそのプログラムがクライアントとなり、サーバたる「端末」に接続に行きます。
この場合は「端末」上のプログラムの接続元アドレスは「プロキシサーバ」の「端末」側のアドレスになります。

一方、透過型プロキシの場合は、パケットの回送のような動作を行いますので、
「クライアント」のIPアドレスが「端末」の接続元アドレスになります。
透過型プロキシは、プロキシサーバ自身が左から右、右から左それぞれの通信において、
パケットの発アドレスを接続元のアドレスに変換するような仕組みになっています。
また、「プロキシサーバ」の左右それぞれのネットワークから、
反対側のネットワークに向かうゲートウェイがそれぞれ「プロキシサーバ」になっている必要があります。
内部的に何らかの処理をしていながら、見た目はただのハブやルータのような通信経路なので、
「透過型プロキシ」と呼ばれます。

ちなみに、いずれの場合もプロキシサーバ上の処理プログラムはbind()した上でliseten(), accept()しており、
端末につなぎに行く段階でconnect()しています。
    • good
    • 0
この回答へのお礼

説得力のある説明ありがとうございます。
自信が確信に変わりました。
ちなみに、ご存じなら伺いたいのですが、
ブラウザEXEプロセス(例えばIE)も同じ仕組みで、
通信しているのでしょうか?
どの言語で出来ているか分かりませんが、
bindやlisten, accept, connetと等々しているのでしょうか?

お礼日時:2016/05/29 21:13

>ここに入っているipアドレス(下記のdstAddr.sin_addr)


>は、どういったものでしょうか?

相手と通信するのに必要なIPアドレス…かと。

>例えば次の場合
>クライアント --- プロキシサーバ  --- 端末
>プロキシサーバのipアドレスですか?

クライアントの代わりにプロキシが通信してきているのですから、こちらが記録されるでしょう。

>それともクライアントのipアドレスですが?

プロキシの向こうは不明ですので知りようがありません。
# Webプロキシの中で「漏れクシ」とか言われるタイプの場合、クライアントのIPアドレスが入っているのはTCPパケット内になります。
# ので、accept()で取れるアドレスには含まれません。

>それともナット変換前のipアドレスですか?

どこのNAT…でしょう?
accept()するサーバ側だった場合、LAN内以外はすべてGWのIPアトデレスになってしまいますが…。
    • good
    • 0
この回答へのお礼

漏れくしですか、勉強になります。
ご回答ありがとうございます。

お礼日時:2016/05/29 21:08

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

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