
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年と言ったところです。
No.1ベストアンサー
- 回答日時:
これはプログラマでは分からないです。
エンド・ツー・エンドを中継している
機器がどういった環境に設定(設計)に
するかによります。
プログラマとしては、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となります。
いかがでしょうか?
回答ありがとうございます。
まさに自分が知りたかったことを回答して
頂きましたね。
自分も、そうなんだろうなと思ってはいました。
実装できそうです。
No.4
- 回答日時:
No.3です。
>ブラウザEXEプロセス(例えばIE)も同じ仕組みで、
>通信しているのでしょうか?
>どの言語で出来ているか分かりませんが、
>bindやlisten, accept, connetと等々しているのでしょうか?
サーバはsocket()→bind()→listen()→accept()です。
ブラウザ等のクライアントは普通、socket()→connect()です。
ただし、場合によっては(発IPやポート番号を固定にする場合など)connectの前にbindすることもあります。
bind, listen, acceptの機能をもう一度確認してみてください。
No.3
- 回答日時:
これは、どちらの場合もあり得ます。
ただNo.1の方がおっしゃるように、
プログラミングの知識だけではわかりません。
ちなみに、「端末」がサーバでいいのかな?
取れるIPアドレスは、プロキシの種類によってどちらの場合もあり得ます。
「プロキシサーバ」がいわゆる普通のプロキシの場合、
プロキシサーバ上で待ち受けているプログラムが一旦「クライアント」からのリクエストを受け付け、
さらにそのプログラムがクライアントとなり、サーバたる「端末」に接続に行きます。
この場合は「端末」上のプログラムの接続元アドレスは「プロキシサーバ」の「端末」側のアドレスになります。
一方、透過型プロキシの場合は、パケットの回送のような動作を行いますので、
「クライアント」のIPアドレスが「端末」の接続元アドレスになります。
透過型プロキシは、プロキシサーバ自身が左から右、右から左それぞれの通信において、
パケットの発アドレスを接続元のアドレスに変換するような仕組みになっています。
また、「プロキシサーバ」の左右それぞれのネットワークから、
反対側のネットワークに向かうゲートウェイがそれぞれ「プロキシサーバ」になっている必要があります。
内部的に何らかの処理をしていながら、見た目はただのハブやルータのような通信経路なので、
「透過型プロキシ」と呼ばれます。
ちなみに、いずれの場合もプロキシサーバ上の処理プログラムはbind()した上でliseten(), accept()しており、
端末につなぎに行く段階でconnect()しています。
説得力のある説明ありがとうございます。
自信が確信に変わりました。
ちなみに、ご存じなら伺いたいのですが、
ブラウザEXEプロセス(例えばIE)も同じ仕組みで、
通信しているのでしょうか?
どの言語で出来ているか分かりませんが、
bindやlisten, accept, connetと等々しているのでしょうか?
No.2
- 回答日時:
>ここに入っているipアドレス(下記のdstAddr.sin_addr)
>は、どういったものでしょうか?
相手と通信するのに必要なIPアドレス…かと。
>例えば次の場合
>クライアント --- プロキシサーバ --- 端末
>プロキシサーバのipアドレスですか?
クライアントの代わりにプロキシが通信してきているのですから、こちらが記録されるでしょう。
>それともクライアントのipアドレスですが?
プロキシの向こうは不明ですので知りようがありません。
# Webプロキシの中で「漏れクシ」とか言われるタイプの場合、クライアントのIPアドレスが入っているのはTCPパケット内になります。
# ので、accept()で取れるアドレスには含まれません。
>それともナット変換前のipアドレスですか?
どこのNAT…でしょう?
accept()するサーバ側だった場合、LAN内以外はすべてGWのIPアトデレスになってしまいますが…。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ツイキャス ツイキャスでアカウントロックされたとき、IPアドレスが自動取得で変更されても、PC端末が特定される? 1 2022/10/15 15:49
- FTTH・光回線 グローバルIPアドレスの変更について 1 2022/04/23 05:32
- UNIX・Linux raspberry piを使ったWebサーバー制作をしています、接続するネットワークを変更したときに 1 2023/01/09 15:57
- VPN 接続のたびにIPが変わるVPNサービスが知りたい 2 2022/06/27 02:34
- Wi-Fi・無線LAN 無線ルーターのIPアドレスは、iPhoneのように簡単に変更できる??? 2 2022/04/02 19:00
- その他(インターネット接続・インフラ) モバイルデータ使用時のipアドレスについて 1 2022/06/07 20:55
- Wi-Fi・無線LAN iPhoneのIPアドレスは機内モードをオンで変わるように、無線ルーターも何かの方法で変更できる? 2 2022/04/02 14:37
- ネットワーク 例えば192.168.1.10はプライベートIPアドレスで合っていますか? 3 2022/07/05 01:18
- SoftBank(ソフトバンク) スマホ ipアドレス 4 2022/08/24 01:26
- FTTH・光回線 光回線、中継器を導入した際の端末側のローカルipアドレスについて 3 2023/03/11 14:10
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Connectエラーが出てしまう・・...
-
ソケットのクローズについて
-
UDPを使って帯域測定プログラム...
-
TCP/IP通信時のサーバーからの受信
-
UDP通信する時に、相手にどうや...
-
Socket通信の0バイト受信について
-
recv関数でフリーズしてしまう
-
PerlでSocketを閉じずに再利用...
-
closeされたsocketへの動作につ...
-
VB6のwinsockでconnectできない
-
MFCソケットについて
-
メールサーバへの接続タイムア...
-
read()メソッドを使ったループ...
-
同じLAN内パソコンのIPアドレス...
-
クライアントサーバ型アプリ製...
-
UdpClient 送信元のIPアドレ...
-
ソケット通信のシミュレータツ...
-
winsockのポート指定について
-
VB6‥ソケットについて
-
VC++でのソケット通信について
マンスリーランキングこのカテゴリの人気マンスリー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での通信プログラムがう...
おすすめ情報